我如何正确Log4j,关闭所有Appender,因此,关闭文件

时间:2009-05-08 10:42:28

标签: java servlets resources log4j

我的基于servlet的web-app有时无法在重新部署时关闭Log4j日志文件,泄漏到文件描述符泄漏,偶尔导致servlet包含的“太多打开文件”死亡。

我有一个ContextListener,我应该把它放在contextDestroyed()中以告诉log4j关闭并释放所有资源?

快速浏览javadocs,发现Hierachery类有shutdown()方法。我不知道如何真正获得当前的Hierachery,而javadoc声明这个类里面没有用户可维护的组件:)

2 个答案:

答案 0 :(得分:19)

试试这个:

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

但是,您遇到的问题很奇怪,不应该发生。您使用的是JVM,容器,log4j版本?

答案 1 :(得分:1)

我遇到了同样的问题,但我的解决方案需要两个步骤:

首先,我必须从servlet LogManager.shutdown()方法调用destroy()

然后我必须修复我们自己的Appender实现的close()方法(它是AppenderSkeleton的子类),以便它正确地从getAllAppenders()关闭appender。