Linuxでログファイルの状態をリアルタイムで確認する場合 tail
コマンドに -f
オプションをつけて tail -f {ログファイル名}
という使い方をすることが多々あります。
例えば、今まさにログが追記されている application.log
というログファイルの内容を
リアルタイムで確認するには以下のように実行します。
tail -f application.log
そして、こういう時には往々にして、出力される内容を特定の文字列が含むものだけに絞り込みたい場合があります。
例えば ERROR というキーワードが付いた行だけ出力したい。となった場合は以下のようにパイプで繋いで grep
するようにします。
tail -f application.log | grep "ERROR"
こうすると ERROR という文字列が含まれる行だけ出力されるようになります。
さらに絞りこんだ内容に test-user
が含まれる行は除外したい となった場合は、さらにパイプで繋いで以下のようにします。
tail -f application.log | grep "ERROR" | grep -v "user-test"
しかし、こうすると結果がリアルタイムで出力されません。
これは、grep
がバッファリングしているためで、バッファが一定量になるまで出力されません。
こういう時は、grep に --line-buffered
のオプションを付ける事でバッファリングしなくなり、リアルタイムで出力されるよになります。
先ほどの例は以下のように書き換えできます。
tail -f application.log | grep --line-buffered "ERROR" | grep --line-buffered -v "user-test"
これでgrepを重ねても、リアルタイムで出力されるようになります。
(ただし、--line-buffered
を使うとパフォーマンスが若干悪くなる場合があるようです。一応意識はしておいた方がいいかもしれません)