やりたいこと
新規に作成されるlogファイルを追跡して表示する。関数などは作らずにワンライナーで実現できるようにする。
tailコマンドの基本的な機能
tailコマンドでlogファイルを表示し続けるには
$ tail -f file.log
# 一旦file.logがリネームや消去をされて新たにfile.logが作成されても表示し続ける
$ tail -F file.log
のどちらかを使えば事足りるが、別名で新たなファイルが作成されたときにそれらを追跡して表示し続けるにはtailコマンドだけで完結させるのは無理。
tailコマンドで最新ファイルの表示
file1.log, file2.log ... などの新たな別名のファイルにログが追加されているときに一番最新のファイルを表示するには
$ tail -f $(ls -tr file*.log | tail -n 1)
でいい。しかし、$(ls -tr file*.log | tail -n 1)
部分はコマンドを打ったときの一回のみ実行されるため、その後新たなファイルができたとしても追跡して表示はしてくれない。
- 参考: https://stackoverflow.com/questions/3416467/how-to-tail-f-the-latest-log-file-with-a-given-pattern
場合によってはダメなパターン
$ watch -n 60 -c "ls -tr file*.log | tail -n 1 | xargs tail"
とすれば60秒ごとに監視して新しいファイルができた場合にそちらを表示する。watchコマンドの-c
はテキスト内のカラー表示。概ねこれでやりたいことは達成できるが、ログファイルにtqdmなどでプログレスバーを表示させたり復帰の\r
が入っていると普通のtail -f
では正常に表示してくれてもこの方法だと表示が崩れる。
常に良いパターン
$ while : ; do timeout 60 tail -f $(ls -tr file*.log | tail -n 1) ; done
watchコマンド内でのtailコマンドは復帰がある場合の表示が崩れるので無限ループとtimeoutを組み合わせた方法を使うことにより、通常のtailコマンドの結果を表示できるので表示も崩れない。