Log4j2 - ServletContextListener中的ThreadLocal内存泄漏

关闭Tomcat时出现以下错误:

严重:Web应用程序[App]使用类型为[org.apache.logging.log4j.core.layout.PatternLayout $ 1]的键创建了一个ThreadLocal(值[org.apache.logging.log4j.core.layout.PatternLayout $ 1 @ 14391aaf])和类型[java.lang.StringBuilder]的值(值[2015-09-30 14:22:27.832 [localhost-startStop-1] ERROR AppLogger - 错误日志 . ])但是当它没有被删除时Web应用程序已停止 . 线程将随着时间的推移而更新,以避免可能的内存泄漏 .

只有当我尝试在ServletContextListener实现中的contextInitialized或contextDestroyed方法中记录某些内容时,它才会出现 . 一旦Tomcat启动,日志在应用程序的其余部分中工作正常 . 我注意到StringBuilder的值始终是记录的最后一个条目 . 在这种情况下,以下代码生成日志:

@Override
public void contextInitialized(ServletContextEvent arg0)
{
    Logger logger = LogManager.getLogger("AppLogger");
    logger.error("Error log.");
}

经过几个小时的调查(包括SO),我仍然无法找到解释 . 这是一个Log4j2初始化问题吗?这是我应该报告的错误吗?

我在Eclipse 4.5中使用Tomcat 8.0

log4j-core-2.4,log4j-api-2.4,log4j-web-2.4在classpath中 .

web.xml在'WEB-INF'中

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   version="3.0">

<context-param>
    <param-name>log4jContextName</param-name>
    <param-value>App</param-value>
</context-param>

</web-app>

log4j2.xml在'src'中

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!-- http://logging.apache.org/log4j/2.x/manual/configuration.html -->
<Appenders>
    <File name="File" fileName="/home/user/app.log">
        <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
    <Console name="Console">
        <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
</Appenders>
<Loggers>
    <Logger name="AppLogger" level="ALL">
        <AppenderRef ref="File"/>
    </Logger>
    <Root level="ALL">
        <AppenderRef ref="Console"/>
    </Root>
</Loggers>
</Configuration>

回答(1)

2 years ago

这与ThreadLocal introduced in Log4j 2.4有关 . 这是在发布之后发现的,并且在下一个版本中发布了will be fixed,它将是2.4.1或2.5(我们希望这将很快,在一周或两周内) .