Log4j2 は、シャットダウン フックも使用してサービスを終了します。しかし、もちろん、アプリケーションのライフサイクル全体 (シャットダウンを含む) を通じてログを記録したいと考えています。Log4j では、これは問題ありませんでした。今は無理そうです。アプリケーションがまだ作業中ですが、ロギングがシャットダウンします。私に希望を持っている人はいますか?
よろしくマーティン
Log4j2 は、シャットダウン フックも使用してサービスを終了します。しかし、もちろん、アプリケーションのライフサイクル全体 (シャットダウンを含む) を通じてログを記録したいと考えています。Log4j では、これは問題ありませんでした。今は無理そうです。アプリケーションがまだ作業中ですが、ロギングがシャットダウンします。私に希望を持っている人はいますか?
よろしくマーティン
私は基本的に同じ質問に答えたばかりで、ここで答えを共有するのは難しいと思います. ここで入手可能な完全な回答を読むことをお勧めします。ここで要約を提供し、現在のコンテキストに私の答えを適応させようとします。
最初のバージョンでは、Log4j はシャットダウン手順を手動で呼び出す API を提供していました。不明な理由により、2 番目のバージョンから削除されました。現在、それを行う正しい方法は(存在しないドキュメントによると)、ShutdownCallbackRegistry
シャットダウン手順を担当するインターフェースの独自の実装を提供することです。
この問題を修正するために私が行ったことは、独自のバージョンのShutdownCallbackRegistry
インターフェースを実装したことです。デフォルトの実装とほぼ同じことを行いますが、それ自体をシャットダウン フックとして JVM に登録する代わりに、手動で呼び出されるまで待機します。
GitHub/DjDCH/Log4j-StaticShutdownで完全なソリューションと手順を見つけて、自分のプロジェクトで使用できます。基本的に、最後に、アプリケーションで次のようなことを行うだけで済みます。
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
try {
// Do your usual shutdown stuff here that need logging
} finally {
// Shutdown Log4j 2 manually
StaticShutdownCallbackRegistry.invoke();
}
}
}));
これが完璧なソリューションであり、私の実装が完璧であることに疑いの余地はありませんが、正しい方法で実行しようとしました。この解決策が適切かどうかに関係なく、フィードバックをお待ちしております。