今回はログを監視して、メッセージに特定の文字列が表示されたら、シェルスクリプトの指定したアクションで、メッセージの内容を利用した処理を行うのが目的です。
例えば、WEBサーバーのログに「404」の文字列が表示されたらゴニョゴニョするなどです。
運用・管理面では使えるコマンドだと思いますが、ログ解析ツールが無料で世の中に出回っている昨今、あまり活躍する場面が思い浮かびませんが…。
使うかどうかはわかりませんが、覚えておいて損はないと思いもいます。
目次
tailコマンドでログ監視
以下のような記述をすることで、指定したログをリアルタイムで監視することができます。
1 |
tail -n 0 -F /path/to/log |
オプションの解説は後程ご紹介します。
まずは、シェルスクリプトのサンプルを作成してみましたのでご覧ください。
サンプルスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/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は単にファイルが存在しないことを報告して以降のチェックを行わない。(ログローテート対策)
Qiita
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JUUzJTgzJUFEJUUzJTgyJUIwJUU3JTlCJUEzJUU4JUE2JTk2JUUzJTgyJUI5JUUzJTgyJUFGJUUzJTgzJUFBJUUzJTgzJTk3JUUzJTgzJTg4JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz1hODc0MmIyZDc5MWE2MWEyODA5NTUxZmI1YmMwNjc5Yw&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBRcmcmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWQxNDg4MDMzMTdiNWY0YzkxZTg5NmQxOWVlMGZjOTAw&blend-x=142&blend-y=486&blend-mode=normal&s=fdfd8911af623bdb370f6838dc5d0ffe)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JUUzJTgzJUFEJUUzJTgyJUIwJUU3JTlCJUEzJUU4JUE2JTk2JUUzJTgyJUI5JUUzJTgyJUFGJUUzJTgzJUFBJUUzJTgzJTk3JUUzJTgzJTg4JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz1hODc0MmIyZDc5MWE2MWEyODA5NTUxZmI1YmMwNjc5Yw&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBRcmcmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWQxNDg4MDMzMTdiNWY0YzkxZTg5NmQxOWVlMGZjOTAw&blend-x=142&blend-y=486&blend-mode=normal&s=fdfd8911af623bdb370f6838dc5d0ffe)
ログ監視スクリプト - Qiita
ログ監視スクリプト目的ログファイルに特定の文字列が出力されたら、何か処理を実行したい。裏の目的Qiitaに投稿してみたかった。環境CentOSbashスクリプト/var/log/m…
最後に
著者の勘違いによるものなのですが、このコマンドで感動したことは、最終行だけ見ているわけではないということ。
例えば、同じタイミングで一気にログに10行追加されても、末尾だけでなく追加された10行分を逃さず見ることができます。
今後、何かに使うことがあるかもしれませんね。
コメント
コメント一覧 (1件)
[…] 【Linux】tailコマンドを利用してリアルタイムでログ監視 […]