HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

Log4Jの後始末

Log4Jを使ってWebアプリケーションのログをファイルに記録する場合、Webアプリケーションの終了時に後始末をする必要がある。でないと、ログファイルがロックされたままになるので、ログファイルを削除できない。
そんなときは、Servletのdestroy()メソッドなどの中で次のメソッドを呼ぶ。

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

Log4JのJARファイル(およびlog4j.properties)がWebアプリケーションコンテキストに含まれる場合はこれで問題ない。Webアプリケーションを再起動したときに再びLog4Jが初期化される。
しかし、Log4JのJARファイル(およびlog4j.properties)がアプリケーションサーバーのコンテキストに配置され、複数のWebアプリケーションから使用される場合は注意が必要。shutdown()メソッドを呼び出すとアプリケーションサーバー全体でLog4Jが停止した状態になり、アプリケーションサーバーを再起動しないとログの記録が再開されない。
したがって、Log4JのJARファイルはWebアプリケーションそれぞれに含めなければならない。


Commons Loggingを通してLog4Jを使用する場合も後始末が必要になるのだが、Commons Logging 1.1.1とLog4J 1.2.15の組み合わせで、どうもうまくいかない。
一応、試したもののメモ。

// LogFactoryのstaticメソッドreleaseAll()を呼ぶ。
Log logger = LogFactory.getLog("sample1Logger");
LogFactory.releaseAll();
// LogFactoryのインスタンスを保持しておいて、あとでrelease()する。
LogFactory factory = LogFactory.getFactory();
Log logger = factory.getInstance("sample1Logger");
factory.release();
<!-- Listenerを使用する -->
<listener>
    <listener-class>org.apache.commons.logging.impl.ServletContextCleaner</listener-class>
</listener>