Scrapdiary

DesigningとEngineeringの架け橋

ログ監視にSwatchの導入を検討

以前といってもだいぶ前だけど、スクラッチで作ったアプリのエラーログをハンドリングできず問題になったことがあった。かといっても独自でsyslogとか立てられないので、Perlで書かれたログ監視アプリのSwatch(Simple WATCHer)というツールを使おうかと検討していましたが、なかなか暇がなくほったらかしに・・・これではいけないのでまずは試してみることにしました。

インストール

導入前の検証用にインストールしてみることにしました。ソースは以下の最新版(2009年7月時点)のものを使用。Perlは5.8.8。
http://jaist.dl.sourceforge.net/sourceforge/swatch/swatch-3.2.2.tar.gz
ターミナル経由で直接ファイルをダウンロードするにはwgetを使う。

wget http://jaist.dl.sourceforge.net/sourceforge/swatch/swatch-3.2.2.tar.gz

インストール手順など参考にさせてもらったところでは以下のPerlモジュールが必要らしので、あらじめCPANでインストールしておく。

  • Date::Calc
  • Date::Parse
  • File::Tail
  • Time::HiRes

モジュールのインストールが終わったら、ダウンロードしたSwatchのファイルを解凍・展開し、Makefileを作り、testをしておく。

tar zxvf swatch-3.2.2.tar.gz
cd swatch-3.2.2
perl Makefile.PL INSTALL_BASE=$HOME/lib
make
make test

テストの段階でDate::Manipも必要らしくwarningが出てたので再度cpanからインストール。一度Makefileを削除して再度作成しSwatchをインストールする。

rm Makefile
perl Makefile.PL INSTALL_BASE=$HOME/lib
make
make test
make install

これでMakefileにあるINSTALL_BASEに設定されたパスにSwatchがインストールされる。*1

設定・動作チェック

参照元には

swatchの設定ファイルは、デフォルトでは~/.swatchrcです。swatchには設定ファイルのサンプルが含まれているので、このサンプルファイルを規定のディレクトリにコピーしてひな型ファイルとして利用します。
なお、サンプルファイルには、

  • $SOURCE/swatch-3.0.4/examples/swatchrc.monitor
  • $SOURCE/swatch-3.0.4/examples/swatchrc.personal

の2種類があります。

とあるのだが、解凍したexamles以下にはSendMail.pmというモジュールファイルが1つあるだけ。仕方ないので適当に.swatchrcファイルを${HOME}直下に作ることにした。

vi ~/.swatchrc

以下のようにテスト用の設定ファイルを作成する。watchforの次にログファイル内で検索する文字列を指定。ここではPerl正規表現が利用できる。次にechoはマッチした場合に標準出力へ出力し、mailで指定のアドレスへメールを送る、という設定。

watchfor   /error|fail/
        echo
        mail=foo@hoge.com

ファイルを作成後、Swatchを起動させる。オプションをつけずに起動させると/var/log/messageを監視対象とするので -t オプションをつけてログファイルを指定。daemonモードで起動させるにはオプションで --daemon と指定する。

swatch -c ~/.swatchrc -t ~/tmp/test.log --daemon

これで自分で作ったtest.logに指定した文字列を書き加えていけばSwatchが検知してメールをくれるはず・・・だったのだが、なぜかうまくいかず。試しにログの指定をapacheアクセスログに変更したら、すんなりとうまく動作しました*2。tailコマンドでログのチェックをしているようで検知結果は即メールに配信されてきてとてもいい感じです。
後はスクラッチのアプリのログに対応させるよう設定ファイルを書いてさらに検証してみる予定。

*1:コマンドに「perl Makefile.PL INSTALL_BASE=$HOME/lib」を追記(2009/08/07)

*2:ログファイルをユーザ自身が一度touch(編集)してしまうと検知せず、Perlからログを書き換えると検知しました。このあたりはUnixのファイルに対する扱いの問題なんだろうか・・・。