나는 이것을 위해 여러 가지 제안을 보았지만 아무것도 도움이되지 않는다.SLF4J MDC 메모리 누수
MDC를 사용하는 JAX-RS 애플리케이션이 있는데, 엔드 포인트에 도달하면 디버깅을 쉽게하기 위해 transactionId가 설정됩니다. 그러나 Tomcat을 중지하거나 다시 시작할 때 로그는 다음과 같은 항목으로 채워집니다.
27-9 월 -20 09 : 42 : 14.858 SEVERE [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks 웹 애플리케이션 [/core-1.0.0-RC2]은 type [org.apache.log4j.helpers.ThreadLocalMap] (value [[email protected]])의 키를 가진 ThreadLocal과 값 형식의 [java.util.Hashtable] (value [{siteCode = 000tst, transactionId = dc8f3a1b-1d7a-4f91-abf6-58d015632d03}])하지만 웹 응용 프로그램이 중지되었을 때이를 제거하지 못했습니다. 쓰레드는 시간이 지남에 따라 갱신되어 가능한 메모리 누수를 피하려고 시도 할 것입니다.
<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>
내가 MDC.clear (와 ResponseFilter이있는 경우) 그것은의 값을 제거 :이 내 sl4fj으로 종속되어
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());
}
:
나는 MDC가 호출되는 RequestFilter이 MDC를 사용하지만 스레드를 지우지 않는 것 같습니다 :
09-09 월 12 : 09 : 12 : 58.216 SEVERE [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks 우리는 b application [/core-1.0.0-RC2]은 type [org.apache.log4j.helpers.ThreadLocalMap] (value [[email protected]])의 키를 가진 ThreadLocal을 만들고 값은 [java.util.Hashtable] (값 [{}])을 입력했지만 웹 응용 프로그램이 중지되었을 때 제거하지 못했습니다. 쓰레드는 시간이 지남에 따라 갱신되어 가능한 메모리 누수를 피하려고 시도 할 것입니다.
분명히 log4j 1.2.17에서 수정되었지만 변경 사항이 slf4j로 필터링되지 않은 것처럼 보입니다.
이 방법은 잘못되었습니다. 이제 Log4J에 코드를 묶었습니다. 처음에는 [SLF4J means] (http://www.slf4j.org/api/org/slf4j/MDC.html#clear%28%29)로 MDC를 정리해야합니다. –
작동하지 않았습니다. SLF4J MDC는 1.2.17 수정 사항이 적용되기 전에 이전 버전의 log4j에서 빌드됩니다. 실제 소스를보고 그 사실을 발견했습니다. slf4j에 사용했던 기본 로깅 프레임 워크는 log4j 였으므로 새로운 종속성 등을 요구하거나 로깅 정밀 검사를 완료 할 필요가 없었습니다. –
그래서 log4j를 명시 적으로 업데이트하는 것이 좋습니다. –