我已经搜索了谷歌,查看了多个建议,但没有什么帮助。
我有一个JAX-RS应用程序,使用MDC,在访问端点时设置transactionId以使调试更容易。 但是,当我停止或重新启动Tomcat时,日志中充满了如下条目:
27-Sep-2014 09:42:14.858 SEVERE [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks The web application [/core-1.0.0-RC2] created a ThreadLocal with key of type [org.apache.log4j.helpers.ThreadLocalMap] (value [org.apache.log4j.helpers.ThreadLocalMap@464437fc]) and a value of type [java.util.Hashtable] (value [{siteCode=000tst, transactionId=dc8f3a1b-1d7a-4f91-abf6-58d015632d03}]) 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.
我有一个RequestFilter,其中调用了MDC:
import org.slf4j.MDC;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import java.io.IOException;
import java.util.UUID;
public void filter(ContainerRequestContext containerRequestContext) throws IOException {
String siteCodeHeader = containerRequestContext.getHeaderString("Site-Code");
if (siteCodeHeader != null) {
MDC.put("siteCode", siteCodeHeader);
} else {
MDC.put("siteCode", "NULL");
}
MDC.put("transactionId", UUID.randomUUID().toString());
}
这是我的sl4fj依赖项:
以下是我所需要的sl4fj相关组件:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
</dependency>
如果我有一个ResponseFilter,并使用MDC.clear()方法,这将从MDC中删除值,但似乎无法清除线程:
2014年9月27日09:12:58.216 SEVERE [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks 应用程序[/core-1.0.0-RC2]创建了一个ThreadLocal,类型为[org.apache.log4j.helpers.ThreadLocalMap](值[org.apache.log4j.helpers.ThreadLocalMap@391216c7]),值为[java.util.Hashtable](值[{}]),但在停止Web应用程序时未能删除它。随着时间的推移,线程将得到更新以尝试避免可能的内存泄漏。
显然,在log4j 1.2.17中已经修复了此问题,但更改似乎没有传递到slf4j。