Log4j2 - ServletContextListener中的ThreadLocal内存泄漏

时间:2015-09-30 13:24:56

标签: java tomcat logging memory-leaks log4j2

关闭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在类路径中。

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位于&#39; src&#39;

<?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 个答案:

答案 0 :(得分:1)

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