tail を使用した Bash での日次ログファイルの追跡

tail を使用した Bash での日次ログファイルの追跡

bashスクリプトを使用して現在の日付の名前を付けた複数のログファイルを監視するタスクがあります。 YYYY-MM-DD.log.

(1)ファイルをフォローしましたが、tail -fファイルの回転を処理できませんでした。

それにもかかわらず、tail -F $FILENAME最大24時間しかログを追跡できず、再起動が必要です。

私が達成したいのは、同様のものを作成してtail -F $CURRENTDATE永遠に実行し、深夜ごとに現在の日付の名前を付けた新しいログファイルに従うように切り替えることです。

しかし、変数は$CURRENTDATE動的ではないようです。crontab24時間ごとにスクリプトを実行せずにこれを実行する他の方法はありますか?たぶん、シンボルファイルや他のものを設定しますか?

(2) 同時にtail -f使用する場合、後続のファイルが失われるか、名前が変更された場合、どのシグナルが返されますか?実行中の例外をキャッチする方法。

答え1

この変数は$CURRENTDATE思ったほど動的ではありません。tail -F $CURRENTDATEこの変数は、実行のためにコマンドを評価すると拡張されます。これは、コマンドの実行後に実行してみるとわかりpsます。出力には、現在の日付以外の値が表示されます$CURRENTDATE

$ CURRENTDATE=$(date +%Y%M%d.log)
$ tail -F $CURRENTDATE

$ ps -eaf|grep tail
saml      1171 13564  0 22:13 pts/4    00:00:00 tail -F 20130517.log

あなたが経験している問題は、通常、ほとんどのサーバーデーモン(Apache、Nginx、Jettyなど)がすべての現在の日付を名前付きファイルに書き込んでから、そのファイルを別の名前error.log(後でerror_20130517.log)に回転させる理由です。

error.logこれにより、同じコマンドを使用して継続的に監視できますtail -F error.log

答え2

これがまさにあなたが探しているものです:

watch -n 60 'tail -n 30 /path/to/logfile-$(date +%Y-%m-%d.log)'

これにより、60秒ごとに現在の日付のログファイルが更新されます。 n個のパラメータを必要に応じてカスタマイズしてください。一重引用符に注意してください。これにより、watchコマンドはコマンドを一度評価し、出力を提供するのではなく、毎回コマンドを評価します。私自身も同じ問題があり、これは私にとって完璧に機能しました。他の方法ではなく、この方法でログに記録するプログラムをデバッグする場合は、現在の回答である「大きなプレーヤーはいたずらが好きではないのでlogrotateを使用します」が適切なソリューションだと思います。

これは速くて汚いアプローチですが、何かを開発する場合は、大きな男の子のようにlogrotateを使用してください。

関連情報