我的基于servlet的web-app有时无法在重新部署时关闭Log4j日志文件,泄漏到文件描述符泄漏,偶尔导致servlet包含的“太多打开文件”死亡。
我有一个ContextListener,我应该把它放在contextDestroyed()中以告诉log4j关闭并释放所有资源?
快速浏览javadocs,发现Hierachery类有shutdown()方法。我不知道如何真正获得当前的Hierachery,而javadoc声明这个类里面没有用户可维护的组件:)
答案 0 :(得分:19)
试试这个:
org.apache.log4j.LogManager.shutdown();
但是,您遇到的问题很奇怪,不应该发生。您使用的是JVM,容器,log4j版本?
答案 1 :(得分:1)
我遇到了同样的问题,但我的解决方案需要两个步骤:
首先,我必须从servlet LogManager.shutdown()
方法调用destroy()
。
然后我必须修复我们自己的Appender实现的close()
方法(它是AppenderSkeleton
的子类),以便它正确地从getAllAppenders()
关闭appender。