Log4j 2 内存泄漏
Log4j 2 memory leak
我使用 Tomcat 10.0.6,log4j 2.14.1。当我关闭 Tomcat 时,我看到了这个日志:
13-Nov-2021 22:32:32.915 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [airline] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@59402b8f]) and a value of type [org.apache.logging.log4j.core.impl.MutableLogEvent] (value [org.apache.logging.log4j.core.impl.MutableLogEvent@7188af83]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
13-Nov-2021 22:32:32.915 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [airline] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@6be968ce]) and a value of type [org.apache.logging.log4j.core.pattern.DatePatternConverter.PatternFormatter] (value [org.apache.logging.log4j.core.pattern.DatePatternConverter$PatternFormatter@7c37508a]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
13-Nov-2021 22:32:32.917 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [airline] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@247310d0]) and a value of type [org.apache.logging.log4j.message.ReusableSimpleMessage] (value [org.apache.logging.log4j.message.ReusableSimpleMessage@1033576a]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
13-Nov-2021 22:32:32.917 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [airline] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@303cf2ba]) and a value of type [org.apache.logging.log4j.core.pattern.DatePatternConverter.PatternFormatter] (value [org.apache.logging.log4j.core.pattern.DatePatternConverter$PatternFormatter@76494737]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
13-Nov-2021 22:32:32.921 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [airline] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@59402b8f]) and a value of type [org.apache.logging.log4j.core.impl.MutableLogEvent] (value [org.apache.logging.log4j.core.impl.MutableLogEvent@17fc391b]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
13-Nov-2021 22:32:32.921 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [airline] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@6be968ce]) and a value of type [org.apache.logging.log4j.core.pattern.DatePatternConverter.PatternFormatter] (value [org.apache.logging.log4j.core.pattern.DatePatternConverter$PatternFormatter@2b30a42c]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
13-Nov-2021 22:32:32.926 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [airline] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@247310d0]) and a value of type [org.apache.logging.log4j.message.ReusableSimpleMessage] (value [org.apache.logging.log4j.message.ReusableSimpleMessage@609e8838]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
log4j2.xml
<Configuration>
<Properties>
<Property name="property_console">%d{HH:mm:ss} %-5level %logger{1} - %msg%n</Property>
<Property name="property_file">
%d{yyyy-MM-dd HH:mm:ss} %-5level [%t] %logger{6} - %msg%n
</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${property_console}"/>
</Console>
<RollingFile name="FileRolling" fileName="logs/log.txt" append="true" filePattern="logs/${date:yyyy-MM-dd}/%d{yyyy-MM-dd_HH-mm}.txt">
<PatternLayout pattern="${property_file}"/>
<Policies>
<SizeBasedTriggeringPolicy size="100 K"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="ALL">
<AppenderRef ref="FileRolling"/>
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
我的 log4j2
在 pom.xml
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.14.1</version>
</dependency>
我想这可能与我使用 jakarta.servlet
3.0 依赖有关,但我不知道。
将 .jar 移动到 tomcat/lib 不会得到任何更改。有什么问题吗?
您的假设是正确的:log4j-web
需要支持 ServletContainerInitializer
s,这是在 Servlet 3.0 中引入的。
自 Servlet 5.0(Tomcat10 实现)以来,class 的全名从 javax.servlet.ServletContainerInitializer
更改为 jakarta.servlet.ServletContainerInitializer
由于 Oracle 和Eclipse 基金会。因此 log4j-web
的所有版本都不适用于 Tomcat 10.
编辑:从 Log4j 2.15.0 开始,支持 Jakarta EE 9+ 服务器的 log4j-web
版本可用:log4j-jakarta-web
, which solves the feature request LOG4J2-2978.
我使用 Tomcat 10.0.6,log4j 2.14.1。当我关闭 Tomcat 时,我看到了这个日志:
13-Nov-2021 22:32:32.915 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [airline] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@59402b8f]) and a value of type [org.apache.logging.log4j.core.impl.MutableLogEvent] (value [org.apache.logging.log4j.core.impl.MutableLogEvent@7188af83]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
13-Nov-2021 22:32:32.915 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [airline] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@6be968ce]) and a value of type [org.apache.logging.log4j.core.pattern.DatePatternConverter.PatternFormatter] (value [org.apache.logging.log4j.core.pattern.DatePatternConverter$PatternFormatter@7c37508a]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
13-Nov-2021 22:32:32.917 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [airline] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@247310d0]) and a value of type [org.apache.logging.log4j.message.ReusableSimpleMessage] (value [org.apache.logging.log4j.message.ReusableSimpleMessage@1033576a]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
13-Nov-2021 22:32:32.917 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [airline] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@303cf2ba]) and a value of type [org.apache.logging.log4j.core.pattern.DatePatternConverter.PatternFormatter] (value [org.apache.logging.log4j.core.pattern.DatePatternConverter$PatternFormatter@76494737]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
13-Nov-2021 22:32:32.921 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [airline] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@59402b8f]) and a value of type [org.apache.logging.log4j.core.impl.MutableLogEvent] (value [org.apache.logging.log4j.core.impl.MutableLogEvent@17fc391b]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
13-Nov-2021 22:32:32.921 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [airline] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@6be968ce]) and a value of type [org.apache.logging.log4j.core.pattern.DatePatternConverter.PatternFormatter] (value [org.apache.logging.log4j.core.pattern.DatePatternConverter$PatternFormatter@2b30a42c]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
13-Nov-2021 22:32:32.926 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [airline] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@247310d0]) and a value of type [org.apache.logging.log4j.message.ReusableSimpleMessage] (value [org.apache.logging.log4j.message.ReusableSimpleMessage@609e8838]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
log4j2.xml
<Configuration>
<Properties>
<Property name="property_console">%d{HH:mm:ss} %-5level %logger{1} - %msg%n</Property>
<Property name="property_file">
%d{yyyy-MM-dd HH:mm:ss} %-5level [%t] %logger{6} - %msg%n
</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${property_console}"/>
</Console>
<RollingFile name="FileRolling" fileName="logs/log.txt" append="true" filePattern="logs/${date:yyyy-MM-dd}/%d{yyyy-MM-dd_HH-mm}.txt">
<PatternLayout pattern="${property_file}"/>
<Policies>
<SizeBasedTriggeringPolicy size="100 K"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="ALL">
<AppenderRef ref="FileRolling"/>
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
我的 log4j2
在 pom.xml
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.14.1</version>
</dependency>
我想这可能与我使用 jakarta.servlet
3.0 依赖有关,但我不知道。
将 .jar 移动到 tomcat/lib 不会得到任何更改。有什么问题吗?
您的假设是正确的:log4j-web
需要支持 ServletContainerInitializer
s,这是在 Servlet 3.0 中引入的。
自 Servlet 5.0(Tomcat10 实现)以来,class 的全名从 javax.servlet.ServletContainerInitializer
更改为 jakarta.servlet.ServletContainerInitializer
由于 Oracle 和Eclipse 基金会。因此 log4j-web
的所有版本都不适用于 Tomcat 10.
编辑:从 Log4j 2.15.0 开始,支持 Jakarta EE 9+ 服务器的 log4j-web
版本可用:log4j-jakarta-web
, which solves the feature request LOG4J2-2978.