web-dev-qa-db-ja.com

log4j2を適切にシャットダウンする方法

Webアプリケーション内で実行されていない場合、Log4j2をシャットダウンする適切な方法は何ですか? noop LogManager.shutdown()しか表示されません

13
user671731

このためのパブリックAPIはありませんが、使用できます

_((LifeCycle) LogManager.getContext()).stop();
_

このためのパブリックAPIを使用することに関心がある場合は、投票するか、ここにコメントを追加してください: https://issues.Apache.org/jira/browse/LOG4J2-124


更新:

Log4j 2.5では、Configurator.shutdown()を呼び出すことができます。 Log4j 2.6では、LogManager.shutdown()を呼び出すことができます。

13
Remko Popma

説明と裏話

Log4j 2が内部で使用するのは、ShutdownRegistrationStrategyと呼ばれるものです。これは、適切なタイミングで呼び出される1つまたは複数のシャットダウンコールバックを登録するクラスで構成されます。それらは ShutdownCallbackRegistry という名前のインターフェースと DefaultShutdownCallbackRegistry という名前のデフォルトの実装を提供します。この実装は、Runtime.getRuntime().addShutdownHook()を使用してJVMへのシャットダウンフックとして自身を登録します。

Log4j 2バグトラッカーのいくつかの問題( LOG4J2-868 および LOG4J2-658 )によると、正しい方法はShutdownCallbackRegistry インターフェース。 Log4j 2をシャットダウンするためのパブリックAPIがないため、これをアーカイブするための唯一の実際の有効な方法です。

提案された解決策

したがって、これを修正するために私がしたことは、独自のバージョンのShutdownCallbackRegistryインターフェースを実装したことです。これは、デフォルトの実装とほぼ同じことを行いますが、シャットダウンフックとして登録する代わりに、手動で呼び出されるまで待機します。これは、オブジェクトのインスタンスを静的フィールドに保持することで内部的に可能になります。次に、シャットダウン手順を起動するために単一の静的メソッドを呼び出すだけでよいので、なぜそれを StaticShutdownCallbackRegistry と名付けました。

GitHub/DjDCH/Log4j-StaticShutdown で完全なソリューションと手順を見つけて、独自のプロジェクトで使用できます。基本的に、最後に、アプリケーションで次のようなことを行うだけで済みます。

StaticShutdownCallbackRegistry.invoke();

これが完璧な解決策であり、私の実装が完璧であるとは間違いなく言えませんが、私はそれを正しい方法で実行しようとしました(それに関する存在しないドキュメントによると) 。この解決策が適切であるかどうかにかかわらず、フィードバックをお待ちしております。

8
DjDCH

Log4j-Webライブラリは、Webアプリケーションのリソースを適切にクリーンアップするための推奨される方法です。

これを有効にするには、そのような依存関係をpom.xmlに追加します

<dependency>
    <groupId>org.Apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>${log4j2.version}</version>
    <scope>runtime</scope>
</dependency>

サーブレット3. *環境では「すぐに使用できます」。古いサーブレット仕様を使用している場合、log4j2の適切なクリーニングを有効にする方法の詳細はこちらから入手できます: https://logging.Apache.org/log4j/2.x/manual/webapp.html

8
leokom