ログ監視スクリプト
目的
- ログファイルに特定の文字列が出力されたら、何か処理を実行したい。
裏の目的
- Qiitaに投稿してみたかった。
環境
- CentOS
- bash
スクリプト
/var/log/messagesに、"error hogehoge"と出力されたら、touchコマンドで"/tmp/hogedetayo"を作成します。
#!/bin/sh
# 検出対象ログファイル
TARGET_LOG="/var/log/messages"
# 検出文字列
_error_conditions="error hogehoge"
# ログファイルを監視する関数
hit_action() {
while read i
do
echo $i | grep -q "${_error_conditions}"
if [ $? = "0" ];then
# アクション
touch /tmp/hogedetayo
fi
done
}
# main
if [ ! -f ${TARGET_LOG} ]; then
touch ${TARGET_LOG}
fi
tail -n 0 --follow=name --retry $TARGET_LOG | hit_action
解説
実行したい処理は、上記スクリプト内のtouch /tmp/hogedetayo
の部分に記述してください。
tailコマンドのオプションについて。
tail -n 0 --follow=name --retry $TARGET_LOG
-n : 末尾から表示する行数を指定。ここでは標準出力しないように"0"を指定。
--follow=name :ファイルの内容がどんどん増え続けているものと仮定し、 ファイルの最終部分の文字を読み続けようと無限にループする。 (-fと同じ)
name指定することで、ファイル末尾の追跡を、ファイルが remove された後に行う。tailコマンドは、ファイルが削除 (unlink や rename)されたことを確認すると、もう一度オープンしようと試みる。 (ログローテート対策)
--retry :tail がファイルを名前で追跡していて、ファイルがなくなったことを検知したら、 再オープンを成功するまで繰り返す。このオプションを指定しなければ、 tail は単にファイルが存在しないことを報告して以降のチェックを行わない。(ログローテート対策)
実際の利用では、スクリプトをバックグラウンドで動作させます。
/usr/local/bin/logchecker.sh > /dev/null 2>&1 &
あとがき
文章力が欲しい