我的基于 servlet 的 Web 应用程序在重新部署时有时无法关闭 Log4j 日志文件,导致文件描述符泄漏,并且偶尔会导致 servlet 包含的文件因“打开文件太多”而死亡。
我有一个 ContextListener,我应该在它的 contextDestroyed() 中放入什么来告诉 log4j 关闭并释放所有资源?
快速浏览 javadocs 发现带有 shutdown() 方法的 Hierachery 类。我不知道如何实际获取当前的层次结构,并且 javadoc 声明此类内部没有用户可服务的组件:)
试试这个:
org.apache.log4j.LogManager.shutdown();
但是,您遇到的问题很奇怪,不应该发生。您使用什么 JVM、容器、log4j 版本?
我遇到了同样的问题,但我的解决方案需要两个步骤:
首先,我必须从 servlet
LogManager.shutdown()
方法调用 destroy()
。
然后我必须修复我们自己的 Appender 实现的
close()
方法(它是 AppenderSkeleton
的子类),以便它正确地从 getAllAppenders()
关闭附加程序。