关闭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>
答案 0 :(得分:1)
这与ThreadLocal introduced in Log4j 2.4有关。这是在发布后发现的,will be fixed在下一个版本中发现,它将是2.4.1或2.5(我们希望这将很快,在一两周内)。