今回はログを監視して、メッセージに特定の文字列が表示されたら、シェルスクリプトの指定したアクションで、メッセージの内容を利用した処理を行うのが目的です。
例えば、WEBサーバーのログに「404」の文字列が表示されたらゴニョゴニョするなどです。
運用・管理面では使えるコマンドだと思いますが、ログ解析ツールが無料で世の中に出回っている昨今、あまり活躍する場面が思い浮かびませんが…。
使うかどうかはわかりませんが、覚えておいて損はないと思いもいます。
tailコマンドでログ監視
以下のような記述をすることで、指定したログをリアルタイムで監視することができます。
tail -n 0 -F /path/to/log
オプションの解説は後程ご紹介します。
まずは、シェルスクリプトのサンプルを作成してみましたのでご覧ください。
サンプルスクリプト
#!/bin/bash
target_log="/var/log/httpd/error_log"
search_word="404"sample_action() {
while read i
do
field2=`echo ${i} | grep "${search_word}" | awk '{print $2}'`
if [ -n "${field2}" ]; then
echo ${field2}
fi
done
}tail -n 0 -F ${target_log} | sample_action
exit
まずは末尾をご覧ください。
上記の例では、ログを監視すると同時に新しいメッセージが追加されたら、sample_action()
関数を実行します。sample_action()
の中では、追加されたメッセージに”404“の文字が含まれるかをgrep
コマンドで検索し、見つけたらawk
コマンドで第2フィールドを抽出してecho
で表示するものです。
オプション解説
- -n
- 末尾から表示する行数を指定。
ここでは標準出力しないように”0″を指定。 - -F
- [–follow=name –retry]と同義
- –follow=name
- ファイルの内容がどんどん増え続けているものであるため、ファイルの最終部分の文字を読み続けようと無限にループする。 (-fと同じ)
- –retry
- tailがファイルを名前で追跡していて、ファイルがなくなったことを検知したら、再オープンを成功するまで繰り返す。
このオプションを指定しなければ、tailは単にファイルが存在しないことを報告して以降のチェックを行わない。(ログローテート対策)
最後に
著者の勘違いによるものなのですが、このコマンドで感動したことは、最終行だけ見ているわけではないということ。
例えば、同じタイミングで一気にログに10行追加されても、末尾だけでなく追加された10行分を逃さず見ることができます。
今後、何かに使うことがあるかもしれませんね。
- Original:https://minory.org/linux-tail-f.html
- Source:Minory
- Author:管理者
Amazonベストセラー
Now loading...