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


10

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

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

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

  2. 空のを作成します/var/log/application.logObs:この時点で、申請プロセスはまだ書き込み中です/var/log/application.log.2013-01-28

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

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

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


ファイルをクリアする必要がありますか、それとも単に回転する必要がありますか?
ewwhite 2013年

どんなアプリケーション?アプリケーションは、これを適切に行うためのサポートを提供する必要があります。(それ以外の場合は、非常に醜いことができます。プロセスにアタッチし、新しいファイル、dup2新しい記述子を古いファイルに上書きし、新しい記述子を閉じます。)
David Schwartz

興味深いアプローチのシュヴァルツ。私はそれが実際に動作しているのを見て興味があるので、しばらく遊んでみます。とにかく、アプリケーションは社内にあり、より一般的なソリューションを探しています。私はコルモックの答えが好きです
ブルーノ・ポラコ

@ewwhiteログをローテーションする必要があります。ログデータを失うわけにはいきません
Bruno Polaco

回答:


11

logrotate使用する設定を書く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.

興味深いことに、コピー後にファイルを切り捨てることは、データ損失のマージンがあっても、かなり賢いようです。logrotateでこのオプションに気づきませんでした。洞察のためのThx :)
Bruno Polaco

1

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


そうでない場合は、フォールバックとしてアプリケーションを再起動できます。これは、syslogが通常行うことであり、他の多くのプログラムでも同様です。
lsd 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.