23

Log4j2 は、シャットダウン フックも使用してサービスを終了します。しかし、もちろん、アプリケーションのライフサイクル全体 (シャットダウンを含む) を通じてログを記録したいと考えています。Log4j では、これは問題ありませんでした。今は無理そうです。アプリケーションがまだ作業中ですが、ロギングがシャットダウンします。私に希望を持っている人はいますか?

よろしくマーティン

4

2 に答える 2

9

私は基本的に同じ質問に答えたばかりで、ここで答えを共有するのは難しいと思います. ここで入手可能な完全な回答を読むことをお勧めします。ここで要約を提供し、現在のコンテキストに私の答えを適応させようとします。

最初のバージョンでは、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();
        }
    }
}));

これが完璧なソリューションであり、私の実装が完璧であることに疑いの余地はありませんが、正しい方法で実行しようとしました。この解決策が適切かどうかに関係なく、フィードバックをお待ちしております。

于 2015-03-03T16:12:53.757 に答える