15

我的基于 servlet 的 web 应用程序有时无法在重新部署时关闭 Log4j 日志文件,泄漏到文件描述符泄漏,有时会导致包含 servlet 的文件因“打开的文件过多”而死亡。

我有一个 ContextListener,我应该在它的 contextDestroyed() 中放入什么来告诉 log4j 关闭并释放所有资源?

快速浏览 javadocs 揭示了带有 shutdown() 方法的 Hierachery 类。我不知道如何实际获取当前的 Hierachery,并且 javadoc 指出此类内部没有用户可维护的组件:)

4

2 回答 2

19

试试这个:

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

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

于 2009-05-08T11:01:14.830 回答
1

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

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

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

于 2010-11-15T13:52:11.170 回答