【Linux】tailコマンドを利用してリアルタイムでログ監視

linux-tail-f

今回はログ監視して、メッセージに特定の文字列が表示されたら、シェルスクリプトの指定したアクションで、メッセージの内容を利用した処理を行うのが目的です。
例えば、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行分を逃さず見ることができます。
今後、何かに使うことがあるかもしれませんね。


Amazonベストセラー

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA