tail -f を grep するには --line-buffered オプション!
tail -f
でログファイルの追記を監視して確認することはよくあると思う。他にも kubectl logs
や k8stail
などでログを見る場合も同様。その際、「このログファイル中の 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
オプションは若干オーバーヘッドがある (多少パフォーマンス負荷がかかる) ようだが、自分の環境では特に問題は感じなかったので、今後はコレをガンガン使っていこうと思う。