swatchにinodeでは無くファイル名を追いかけさせる

By shin - 09/06/12 - このエントリをはてなブックマークに追加このエントリをYahoo!ブックマークに追加このエントリをdel.icio.usに追加このエントリをFC2ブックマークに追加

swatchというログ監視ツールがあります。

現在、swatchでメールログに特定の文字列の出現を監視することで、キャリアブロックを検知し、その後の処理を行うスクリプトを起動するという用途で使っているのですが、メールサーバーのロギングにdaemontools付属のmultilogを利用している場合は、swatchの使いかたに少し工夫が必要です。

swatchの挙動

swatchの標準の起動方法では、perlの「File::Tail」を用いて、iノード番号を基にファイルオープンし、最終行に出力される文字列をバックグラウンドで監視し続けます。この時、swatchはiノード番号を追い続けるので、ログローテーションによって監視対象のファイルが入れ替わった事に気付きません。

 

そのため、メールログをsplogerなどで出力しており、logrotateによってローテーションしている場合、logrotate.dに書かれた設定ファイルのローテーションのタイミングでswatchを再起動させる必要があります。新しく生成されたログファイルを開きなおすためです。

 

しかし、daemontoolsに付属のmultilogは通常の利用法だとログファイルのサイズによってローテーションを実行させる事が多いと思います。この場合、logrotateの様に予め決められたタイミングでは無いため、swatchを再起動させる事が難しくなります。

解決策の例

そこで今回はこの問題を手軽に解決するため、「–read-pipe」というswatchのオプションを使います。

「–read-pipe」オプションはファイルへの出力では無く、指定したコマンドやスクリプトの実行結果をswatchに渡すためのオプションです。このオプションを利用し、swatchが標準で利用するperlの「File::Tail」ではなく、「tail –follow=name」又は「tail -F」の出力結果を利用すれば、multilogによる不定期なローテーションの後であっても、同一ファイル名の新しいログファイルを監視し続けてくれます。

 

具体的には下記の様に起動してやればOKです。


TARGET='/path/to/log/current' # メールログ
CONFIG='/path/to/configFile' # 監視対象の文字列や対応など
/usr/bin/swatch -c ${CONFIG} --read-pipe="/usr/bin/tail --follow=name --lines=1 ${TARGET} "