使用log4j2.0-rc1配置停止Web应用程序时,无法删除ThreadLocal

时间:2014-03-12 18:22:13

标签: asynchronous log4j2

我使用log4j2为我的Web应用程序实现了日志记录模块。它在tomcat服务器上运行。我之前使用的是log4j2-beta9版本,并在测试区域部署了我的应用程序。最近我迁移到log4j2.0-rc1版本的日志记录模块并启用了异步日志记录。 但是当我关闭我的应用程序时,我在catalina.out中观察到以下错误。根据log4j2.0-rc1发行说明,在此最新版本中修复了类似的问题,但我观察到了类似的错误

SEVERE:Web应用程序[/ Example1]创建了一个ThreadLocal,其键为[java.lang.ThreadLocal](值为[java.lang.ThreadLocal@1701b802]),类型为[org.apache.logging。 log4j.core.async.AsyncLogger.Info](值[org.apache.logging.log4j.core.async.AsyncLogger$Info@71d7971a])但在Web应用程序停止时无法将其删除。线程将随着时间的推移而更新,以避免可能的内存泄漏。

Exception in thread "Thread-3" java.lang.NoClassDefFoundError: org/apache/logging/log4j/core/config/NullConfiguration
        at org.apache.logging.log4j.core.LoggerContext.stop(LoggerContext.java:210)
        at org.apache.logging.log4j.core.async.AsyncLoggerContext.stop(AsyncLoggerContext.java:57)
        at org.apache.logging.log4j.core.LoggerContext$ShutdownThread.run(LoggerContext.java:437)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.core.config.NullConfiguration
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)

我不确定这个问题可能是什么原因。感谢是否有人可以解释此问题的根本原因。是log4j2库还是我的应用程序配置问题。 仅供参考,我正在使用具有系统属性的RollingRandomAccessFile appender -DLog4jContextSelector = org.apache.logging.log4j.core.async.AsyncLoggerContextSelector。

2 个答案:

答案 0 :(得分:0)

这看起来像log4j2中的现有问题:https://issues.apache.org/jira/browse/LOG4J2-493

其中一个解决方法(在故障LOG4J2-493中提到)是从Web服务器(容器)共享lib文件夹中删除log4j2 jar,而是在Web应用程序的WEB-INF / lib中包含log4j2 jar。

答案 1 :(得分:0)

我有log4j2的内存泄漏,但这是由于配置错误造成的。我在tomcat / lib文件夹中有log4j2 jar,在web.xml中设置了Log4jContextSelector,并且在web.xml中也设置了配置文件的路径。即使在取消部署应用程序之后,WebAppClassLoader仍然挂在内存中。并且Thread堆栈直接指向log4j2。所以我的解决方案是将所有配置和jar放在tomcat中。 Here I have written more of the explanation of my issue