Javaまたは他のプラットフォームでlogrotateに優しいファイルライターを作成するにはどうすればよいですか?

java logging logrotate
Javaまたは他のプラットフォームでlogrotateに優しいファイルライターを作成するにはどうすればよいですか?

logrotateと互換性のあるファイルライター/ロガーをJavaで実装するためのベストプラクティスは何ですか? 目標は、ログAPI(Log4Jなど)の組み込みのローテーション/管理を使用する代わりに、すべてのログ管理にlogrotateを使用できるようにすることです。

Java以外の、他の開発プラットフォームについてのコメント/回答を聞くことに興味があります。

  9  4


ベストアンサー

アプリケーション内のログファイルを定期的に閉じて再度開くだけです。 最後の終了時刻を保持するハンドラが必要です。 (たとえば)最後のクローズから20秒が経過し、ログエントリが書き込まれようとしている場合、ハンドラはファイルを閉じて、再度開く必要があります。 ログエントリを書き込む直前にこのようなチェックを行う必要があります

そうしないと、logrotate(!)(ファイル記述子は同じまま)によって名前が変更されても、ログは古いファイルに書き込まれ、その後、ログが圧縮されて削除されるとログエントリは消えます(そのような場合、javaはそのようなログを静かにドロップします)。

(ファイル名を使用して)ログを閉じて再度開くと、ファイルの名前が変更された場合に新しいファイルが作成されます。 ファイルを開くことはコストのかかる操作であるため、ログが書き込まれるたびにファイルを閉じて再度開くことはやり過ぎです。

8


他のいくつかのアプリを見ましたが、明らかに postrotate`オプションとhttps://unix.stackexchange.com/questions/147938/rotating-log-files-while-process-still-running [ copytruncate`オプション]があります。 copytruncateオプションの方が簡単ですが、バッファがフラッシュされないため(つまり@Jarek Potuikの回答に従う)、重複している場合やエントリが削除される場合があるため、信頼性は低いと思います。

したがって、 `postrotate`オプションが必要だと仮定しましょう:

`postrotate`オプションを使用すると、コマンドを実行して、アプリケーションにファイルを再度開くように指示できます(閉じてから開く)。 Javaでファイルを開いたり閉じたりするときに、同期ブロックまたは何らかのロックを使用してこれを実行し、もちろんすべてのバッファーをフラッシュします。

あなたのアプリが `myapp`と呼ばれると仮定しましょう:

`/ etc / logrotate.d / myapp`には次のようなファイルがあります:

/var/log/myapp/*.log {
        weekly
        missingok
        rotate 20
        compress
        delaycompress
        notifempty
        sharedscripts
        postrotate
            /etc/init.d/myapp rotate-logs > /dev/null
        endscript
}

コマンド `/etc/init.d/myapp rotate-logs`は、ログファイルを閉じて再度開くようにアプリに通知する必要があります。

JavaはIPCを十分にサポートしていないため(Unixシグナルなど)、シグナル部分はかなりトリッキーであり、使用しているアプリの種類に依存します。サーブレットコンテナの場合)、ログファイルを閉じて再度開くようにアプリに指示します。

0


タイトルとURLをコピーしました