tail -f を grep するには --line-buffered オプション!

tail -f でログファイルの追記を監視して確認することはよくあると思う。他にも kubectl logsk8stail などでログを見る場合も同様。その際、「このログファイル中の WARN と出てくる行だけ tail -f したいんだよなぁ…」という場合があると思う。

良いやり方はないかと思ってググってみたら、grep コマンドにある --line-buffered というオプションがそれを実現してくれることを発見。

# ログファイル中の `WARN` に合致する行だけ追跡して出力し続ける
$ tail -f ./my-log-file.log | grep --line-buffered 'WARN'

メッチャ簡単やんけ…!!

# k8stail で Kubernetes Pod 群のログを出力する際、
# 「WARN」もしくは「ERROR」を含む行を抽出するが、「hoge-pod」を含む行は除外する
$ k8stail | grep --line-buffered -e 'WARN' -e 'ERROR' | grep --line-buffered -v 'hoge-pod'

こんな感じで grep-e オプションによる OR 検索や -v オプションによる否定検索、そしてパイプでの grep 重ねがけも問題なし。

--line-buffered オプションは若干オーバーヘッドがある (多少パフォーマンス負荷がかかる) ようだが、自分の環境では特に問題は感じなかったので、今後はコレをガンガン使っていこうと思う。