logrotate
のmanページには次のように書かれています:
It can be used when some program cannot be told to close its logfile
and thus might continue writing to the previous log file for some
time.
私はこれで混乱しています。ログファイルを閉じるようにプログラムに指示できない場合、プログラムはsometimeではなくforeverを書き込み続けます。圧縮が次のローテーションサイクルに延期された場合、プログラムは次のローテーションサイクルの後でもそのファイルへの書き込みを続行します。問題の解決をどのように延期していますか?
私の理解では、copytruncate
は、プログラムにログファイルを閉じるように指示できない場合に使用する必要があります。コピーの進行中に、ログファイルに書き込まれた一部のデータが失われることを認識しています。
私はcouchdbのlogrotateファイルを見ていましたが、copytruncate
とdelaycompress
の両方のオプションがありました。
/usr/local/couchdb-1.0.1/var/log/couchdb/*.log {
weekly
rotate 10
copytruncate
delaycompress
compress
notifempty
missingok
}
delaycompress
がすでに存在する場合、copytruncate
を使用しても意味がないようです。何が欠けていますか?
copytruncate
の理解は正しいですが、delaycompress
のマンページの表現は少し誤解を招きます。より適切には、「一部のプログラムに即時そのログファイルを閉じるように指示できない場合」-たとえば、共有スクリプトを使用していて、スクリプトがログを使用してプロセスに信号を送信する場合すべてのログファイルがローテーションされました。
を使用しております:
これにより、Apache access_log
access_log.1
の固定コピーが作成されるため、1日の終わりにStatsパッケージをスクリプトとして実行できます。
翌日、logrotateはファイルを圧縮してaccess_log.2.Zip
を作成します
私があなたの質問を完全に理解しているかどうかはわかりませんが、あなたが私の考えを尋ねているなら...私はこれを使います:
postrotate
killall -HUP syslog-ng
endscript
これは、ログを削除して次のログに移動するための(または少なくとも)良い方法です。 1秒間に大量のデータをログに記録するCiscoのASAプラットフォームなどの「プログラム」は機能します。