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>