シェルスクリプトで作る簡単なログ監視スクリプト
シェルスクリプトでログ監視
いろんなサイトでログ監視スクリプトの紹介がありますが、どれもこれもswatchを使った物ばかりです。
個人的にはインスコするのが面倒くさいので、スクリプトを書いてしまいます。
このスクリプトは、こんな人にお勧めです。
- swatchを使うほどの事じゃない
- ログのローテートにも対応したい
- grepを使うのが大好きだ
- multilogなログを簡単に監視したい
それでスクリプトを次に書いときます。
適宜自分の環境に直してください。
このスクリプトは正直、動作が遅いです。
検索〜メールをあげる部分のロジックはrubyとかで書いた方が、grepを毎回起動するよりも早いと思われます。
実際のスクリプト
環境変数の設定
- LOGPATHにLOGが設置されているディレクトリを設定
- FILEに実際のログファイルを設定(syslogの場合messageとか)
- PATTERNにgrepで抽出するログの条件を設定
- SUBJECTにメールで送られてくるアラートの件名を設定
- MAIL_TOにメールの宛先を設定
その他
- 赤文字で記載している部分(| tai64nlocal)は、multilogで保存しているタイムスタンプ付きログを抽出する場合に使用します(syslogなどのログには必要ありません)。
- 実はtail コマンドは tail --follow=name とすることで、現在開いているファイルが新しく作り直されたりした場合に、再度ファイルを読み直します。
- tail を while にパイプでつないでいるだけですので、tailをkillすれば終了します。
スクリプト
#!/bin/sh
PATH="/bin:/usr/bin:/usr/local/bin"
export PATH
#環境変数
LOGPATH="/service/qmail-smtp/log/main"
FILE="current"
PATTERN="deny"
SUBJECT="ALERT-LOGWATCH"
MAIL_TO="hogehoge@example.co.jp"
cd "$LOGPATH"
tail -n 1 --follow=name $FILE | while read INPUT; do
echo "$INPUT" | grep "$PATTERN" > /dev/null
RET=$?
if [ "$RET" == "0" ]; then
echo "$INPUT" | tai64nlocal | mail -s "$SUBJECT" "$MAIL_TO"
fi
done