
bashスクリプトを使用して現在の日付の名前を付けた複数のログファイルを監視するタスクがあります。 YYYY-MM-DD.log.
(1)ファイルをフォローしましたが、tail -f
ファイルの回転を処理できませんでした。
それにもかかわらず、tail -F $FILENAME
最大24時間しかログを追跡できず、再起動が必要です。
私が達成したいのは、同様のものを作成してtail -F $CURRENTDATE
永遠に実行し、深夜ごとに現在の日付の名前を付けた新しいログファイルに従うように切り替えることです。
しかし、変数は$CURRENTDATE
動的ではないようです。crontab
24時間ごとにスクリプトを実行せずにこれを実行する他の方法はありますか?たぶん、シンボルファイルや他のものを設定しますか?
(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を使用してください。