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