うまいぼうぶろぐ

linuxとhttpdとperlのメモ

swatchでログ監視

perlで作成されている。指定したログをリアルタイムで監視して、

  • 特定のメッセージを検出
  • 外部コマンドの実行

などが出来る。swatch単独で起動するので、cronと無関係。

swatchrc

書式

watchforで検出する文字列を正規表現で書く。ignoreで無視する文字列を指定することも可能。(ignoreを設定する場合はwatchforより上に書く)

watchfor /regex/
  action1
  action2
  ...

特殊変数

$_

マッチした文字列に置き換わる。外部コマンドの引数、メールのsubjectなどに渡すと便利。ただし、コマンドの引数に渡す場合に文字列内に空白が含まれると複数個の引数になるので扱いに注意。ダブルクォーテーションで囲ってしまえば無問題。

watchfor /error/
  exec /path/to/program "$_"

主に設定するアクション

echo

ターミナルに検出した文字列を表示

exec command

文字列を検出した際に実行するコマンド

mail [=address1:address2:...][,subject=your_text_here]

検出した際にメール送信

swatchの起動

引数が少しややこしいかも。

swatch \
  --pid-file=/var/run/swatch.pid \
  --config-file=/path/to/swatchrc \
  --tail-file=/path/to/logfile \
  --tail-args='--follow=name --retry -n 0' &

option

--pid-file

swatchを常駐したときのpidファイル。pidファイルがいらないなら不要

--config-file

swatchrcの場所

--tail-file

監視するログファイル

--tail-args

swatchはデフォルトではtailコマンドでファイルを監視する。そのtailコマンドに渡すオプション。tailで"--follow=name"としているのは、ログファイルがローテートされた際に対応するため。tailはdefaultではfile descripterを追うので、例えば/var/log/messages => /var/log/messages.1とローテートされた場合に、swatchを再起動するまで/var/log/messages.1を監視し続けることになる。