ログファイルのパターンを監視するために、次のことをしたいと思います。
tail -f ./app.log | grep "My Pattern: .*" >> ./MyPattern.txt &
これは500MBに達するまでうまく機能しapp.log
、移動され、app-2015-10-28.0.log
新しいファイルが作成されます。app.log
これが発生するとtail -f
動作が停止します。同じコマンドを停止して再実行すると機能しますが、停止と開始と再起動の間に発生したパターンが失われる可能性があります。
スクロールの別の条件は00:00です。ログが500MB未満の場合でも、同じローリングが発生します。
ログローリングはアプリケーションレベルで行われ、私たちはその部分を制御することはできません。
興味のあるパターンを見逃すことなくログがローリングされたことをどのように検出できますか?
答え1
tail
--follow=descriptor
通常、ログファイルがローリングされたときやファイルが移動されたときにアクセスできなくなるファイルディスクリプタ()が続きます。マンページでこれを確認できますtail
。
- 再試行
ファイルにアクセスできないかアクセスできなくなった場合でも、ファイルを開こうとします。つまり、 --follow=name を使用すると便利です。
したがって、次のように使用します(tail
ディスクリプタの代わりに名前が続きます)。
tail --follow=name --retry logfile | grep "pattern"
ファイルが切り捨てられたり移動されたりすると、tails 出力に次のように表示されます。
$ tail --follow=name --retry logfile
[...]
tail: logfile: file truncated
[...]
tail: `logfile' has become inaccessible: No such file or directory
tail: `logfile' has appeared; following end of new file
[...]