swatchといっても時計ではありません。UNIXのログ監視プログラムのことです。
syslog-ngがあればswatchは要らないかともおもったのですが、最近のswatchは便利な機能がついています。
プログラムでログ監視をしていて任意のメッセージにマッチしたらメールを送る、とか何かのプログラムを実行するようにしていて困るのが、同じメッセージが秒間何十と連続して出てしまった時。
1秒間に何十もメールが送信されてしまいます。。。それが数十秒~数分続くとものすごい数のメールが送られてしまいます。
メールサーバにも負担になりますし、何よりログ監視をしていてメール送信負荷でサーバが過負荷になってしまいます(T_T)
それはsyslog-ngを使った場合でも同じ。
メッセージをfilter()でフィルタしてmatch()でマッチさせるのだけれど、マッチしたときにprogram()へメッセージを渡します。
filter alert_mail {
facility(local3) and
level(notice) and
match("hoge") and
program("/usr/local/bin/alert_mail.pl");
};
program()はsyslog-gn起動時に1回だけ起動されます。
メッセージはプログラムの標準入力<STDIN>へ送られます。
従って、プログラムは標準入力からメッセージを読み込んでぐるぐる回るようなループプログラムにする必要があります。
syslog-ngを終了するとプログラムも終了します。
で、これだとメッセージにマッチするたびにプログラムへメッセージが送られて処理されます。
(syslog-ng 1.6の話です。2.0は違うかもしれません。わかりません。誰か教えて。)
さて、前置きが長くなりましたが、swatchの場合も前は似たようなもんでした。今でもルールの書き方次第では同じになってしまいますが。
pipe("プログラム")を使うとswatch起動時に1回だけ起動され、マッチしたログはプログラムの標準入力へ送られます。
exec("プログラム")を使うとログがマッチするたびにプログラムが実行されます。ケースによってこれが良い場合も悪い場合もありますが、ログがマッチしまくるような状況だとものすごい勢いでプログラムが実行されて過負荷になりかねません。
で、最近のswatchには、thresholdやthrottleというルールがあって、ログがマッチしても15秒間に1回だけプログラムを実行する、みたいなことが出来ます。
waitfor /hoge/
threshold track_by="/hoge/",type=limit,count=1,seconds=15
pipe "/usr/local/bin/alert_mail.pl"
15秒の間に何度ログがマッチしてもプログラムが実行されるのは最初の1回だけ。
上記のcountとsecondsは任意の値を設定できます。
throttleも同じことができますが、tresholdの方が推奨されている?みたいです。
さて、こっからが本題で最近のswatchはログの追跡にtailコマンドを使えます。
昔は使っていませんでした。
tailを使いたくない場合は、swatchのオプションに--use-cpan-file-tailをつけて起動します。
でもこれだと監視対象のログをローテートすると監視されなくなります(追跡できない)。
これを解消するにはやっぱりtailコマンドを使います。
んで、tailのオプションに以下のオプションを付けると、ログがローテートされた後もログの追跡を続けてくれます。
swatch -f /usr/local/etc/swatchrc -t /var/log/hoge --tail-args='--follow=name --retry -n 0'
tailコマンドのオプションをつけないとtailコマンドを使わない場合と同様に、監視対象のログがローテートされると追跡されなくなります。
理由は追跡にファイル・ディスクリプターを使っているからです(--follow=descriptorがデフォルト)。
--follow=nameオプションは追跡をファイル名で行って、--retryオプションで監視対象のファイルがなくなってもオープンできるようになるまでリトライして、オープンできたら再び追跡を始めます。
こうしておけば、ログローテートしてもswatchを再起動する必要がありませんv(^-^)v
サイトを見てると、結構再起動せよ、みたいなことを書いている人がいるけどf(^^;
再起動したい人はこんな感じ。
/var/log/hoge {
postrotate
/etc/rc.d/init.d/swatch restart
endscript
}
postrotateとendscriptの間には複数のコマンドを書けるので、syslogdをkill -HUPしてからswatch restartすることも可能です。
尚、init.d/swatchは自分で作ってくださいw
ググればいっぱい出てきます。
尚、CentOS4にswatchを入れたい場合は、FC6のswatchのSRPMをリビルドすればインストールできます。
できたRPMをインストールしてもinitスクリプトはありませんので、やっぱり自分で作ってくださいw
swatchでtailコマンドを使用した場合で、swatchのpidをkillしてもtailが死にません。
bugなのかなぁ?
一応、誰かが作ったパッチがあります。
ボクはこのパッチの中で、tailコマンドへシグナルを伝えている部分だけを抜き出してswatch-3.2.1にパッチを当ててみました。
その後、swatchをkillするとtailコマンドも死ぬようになりました。
パッチを当ててない状態だと、tailコマンドをkillすればswatchも死にます。
ただし、killproc tailとかkilall tailとかしちゃうと痛い目を見るかもしれませんw
誰もtailコマンドを使っていなければ問題ないけれど:-(
尚、swatchのpidを知りたい場合は、swatch起動時に--pid-file /var/run/swatch.pidを指定しておけば、pidファイルを作れます。
関連記事
・第4回 サーバのログ監視ツールを使いこなそう (via @IT)
