2009-05-08 10 views
15

私のサーブレットベースのWebアプリケーションは、再配布時にLog4jログファイルを閉じることができず、ファイル記述子の漏れに漏れて、多くのオープンファイル '。Log4jを正しく閉じると、すべてのAppenderとそのファイルを閉じる方法

私はContextListenerを持っていますが、log4jにすべてのリソースをシャットダウンして解放するように指示するには、contextDestroyed()に何を入れてください。

javadocsをすばやく見て、shutdown()メソッドを使用してHieracheryクラスを公開しました。

org.apache.log4j.LogManager.shutdown(); 

しかし、あなたが経験している問題がある。これを試してみてください、私は実際に現在のHieracheryを取得する方法については考えている、とjavadocの状態このクラスは内部で:)

答えて

19

は、ユーザーが修理できる部品はありません奇妙なことではありません。どのようなJVM、コンテナ、log4jバージョンを使用していますか?

+0

私はSunのJVM6、Resinとlog4jを使用しています。1.2.14 時々、クラスローダーがリークし、リサイクル(ファイナライズ)するのを防ぎます。私はそれをまだ理解していません。 ヒントありがとう! – alamar

1

私は同じ問題を抱えていたが、私の解決策は二つのステップが必要:

まず、私はサーブレットdestroy()方法からLogManager.shutdown()を呼び出す必要がありました。

getAllAppenders()からアペンダーを適切に閉じるように、私たちは独自のアペンダー実装(AppenderSkeletonのサブクラス)のclose()メソッドを修正しなければなりませんでした。

+4

Servlet destoryメソッドは、いつでも呼び出すことができます(仕様別)。むしろServletContextListenerを使うべきです - contextDestroyedというメソッドがありますが、これは一度だけ呼び出されます。 –

関連する問題