swatchを使ったログ監視におけるswatch自身の監視
サーバのログ監視ツールとして、swatch というツールがあります。
うちでも、syslog のログを swatch で監視してます。
google:swatch ログぐらいのキーワードで検索すると、swatchの設定について書かれたページがいろいろとありますので、そちらにお任せするとして….。
ここでは、「swatch自体が正常に動いているかどうかを監視する」方法について書いてみます。
ついでに、syslogd が正常に動いているかどうかも監視できます。
基本的な流れからいうと、
- logger を使って、ある特定のキーワードをログに出力させる。
- そのキーワードを swatch で拾い、ある特定のファイルを touch してファイル日付を更新する。
- nagios(またはシェルスクリプト)で、上記ファイルの更新日付を監視し、長時間変更されていなければアラートをあげる。
ということをします。
logger でのログ出力。
以下のようなシェルスクリプトを、たとえば、10分に1回動くように cron に登録します。
#!/bin/sh logger -i -t logger 'swatch check'
swatch の設定ファイルに以下のようなログ監視を追加します。
# # swatch alive check # watchfor /swatch check/ exec=/usr/bin/touch /var/tmp/swatch-messages.alive
ログに「swatch check」という文字列が出力されたら、あるファイル(上記の場合は、/var/tmp/swatch-messages.alive)を touch してファイル日時を更新するという動きをします。
ファイル日時の監視。
うちでは nagios が動いているので、nagios のファイルの日付やサイズを監視するプラグイン(check_file_age)を使います。
checkcommand.cfg は以下のような定義。
define command{ command_name check_file_age command_line $USER1$/check_file_age -w $ARG1$ -c $ARG2$ -f $ARG3$ }
services.cfg で、以下のように定義。(肝心なところだけの抜粋)
define service{ ~ check_command check_file_age!660!660!/var/tmp/swatch-messages.alive ~ }
これで、swatch が停止したり、syslogd が停止したりして、ファイルの更新日時が11分以上変更されないと、nagios のアラートがあがります。
nagios を使えない時には、以下のようなシェルスクリプトを使い、このシェルスクリプトを cron に登録して定期的にチェックすることでアラートをあげることもできます。
#!/bin/sh fileage=`/usr/bin/stat --format=%Y $1` nowage=`/bin/date '+%s'` difftime=`/usr/bin/expr $nowage - $fileage` if [ $difftime -gt 660 ] then echo $1 is $difftime seconds old. | /bin/mail -s 'swatch or syslogd not active?' root fi
上記のシェルクリプトは引数として「監視したいファイルへのフルパス」をとります。