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

Asynchronous 使用log4j2.0-rc1配置停止web应用程序时,无法删除ThreadLocal,asynchronous,log4j2,Asynchronous,Log4j2,我使用log4j2为我的web应用程序实现了日志模块。它正在tomcat服务器上运行。我之前使用的是log4j2-beta9版本,并在测试区域部署了我的应用程序。最近我迁移到log4j2.0-rc1版本的日志模块并启用了异步日志记录。 但是当我关闭应用程序时,我发现catalina.out中有以下错误。根据log4j2.0-rc1发行说明,在这个最新版本中修复了类似的问题,但我发现了类似的错误 严重:web应用程序[/Example1]使用[java.lang.ThreadLocal](值[ja

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

严重:web应用程序[/Example1]使用[java.lang.ThreadLocal](值[java.lang)类型的键创建了ThreadLocal。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库或我的应用程序配置有问题吗。 仅供参考,我正在使用具有系统属性的RollingAndomAccessFile appender
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector。

这看起来像是log4j2中存在的问题:


解决方法之一(在记录单LOG4J2-493中提到)是从web服务器(容器)共享库文件夹中删除LOG4J2 JAR,而是将LOG4J2 JAR包含在web应用程序的web-INF/lib中。

我对LOG4J2有内存泄漏,但这是由于配置错误造成的。我在tomcat/lib文件夹中有log4j2jar,Log4jContextSelector在web.xml中设置,配置文件的路径也在web.xml中设置。即使在取消部署应用程序后,WebAppClassLoader仍挂在内存中。线程堆栈直接指向log4j2。因此,我的解决方案是将所有配置和jar放在tomcat中

感谢雷姆科的快速回复。当我重新查看我的应用程序jar文件配置时,我发现我的应用程序引用的是log4j2-beta9版本,因此这个问题一直存在于我的应用程序中。现在我更正了代码,它引用的是log4j2-rc1,但我看到下面一个或两个实例的错误,但与前面的相比,它减少了。让我监测两天,确认问题是否得到解决。仅供参考,我的应用程序已配置为在我的WEB应用程序的WEB-INF/lib中包含所有JAR。OK。请确保webserver共享lib文件夹中没有log4j2 jar。如果问题仍然存在,请在log4j2问题跟踪器上提出问题。嗨,Remko,当我关闭并重新启动应用程序时,我仍然在catalina.out中观察到以下几个错误实例严重: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..线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。但这不会妨碍写入日志文件。因此,不确定是否需要任何操作来避免错误。