web-dev-qa-db-ja.com

開いていて常に書き込まれているファイルをローテーションする

ロギング情報をログファイルに継続的に書き込むLinuxアプリケーションがあります。 /var/log/application.log。アプリケーションがファイルを自動的にローテーションしないため、このログファイルは数週間でギガバイトのサイズに達する可能性があるため、このファイルを適切にローテーションできるようにしたい

ここでの主な懸念は、アプリケーションによって常に開かれているファイルをローテーションするには、おそらく次のことを行う必要があるということです。

  1. ファイルを回転した形式に移動します/var/log/application.log -> /var/log/application.log.2013-01-28

  2. 空の/var/log/application.logを作成します。 Obs:この時点で、アプリケーションプロセスは/var/log/application.log.2013-01-28にまだ書き込み中です

  3. アプリケーションプロセスのファイル記述子を変更して、再び/var/log/application.logを指すようにします。

それで、私は正しいのですか?もしそうなら、どうすればこれを行うことができますか? (主にファイル記述子部分の変更)

そうでない場合、正しい方法とその方法を教えてください。

10
Bruno Polaco

logrotate configを記述してcopytruncateを使用する

copytruncate
    Truncate the original log file in place after creating a copy, instead of moving the 
    old log file and optionally creating a new one. It can be used when some program
    cannot be told to close its logfile and thus might continue writing (appending) to
    the previous log file forever. Note that there is a very small time slice between
    copying the file and truncating it, so some logging data might be lost. When this
    option is used, the create option will have no effect, as the old log file stays
    in place.
11
R. S.

このようなアプリケーションのほとんどは、SIGHUPなどの信号に応答し、信号を受信するとログファイルを閉じて再度開きます。送信する正しい信号については、アプリケーションのドキュメントを確認してください。

1
Michael Hampton