2016-10-06 5 views
2

로깅 용으로 log4j2를 사용하고 있습니다. tomcat8 및 java8 버전입니다. 속성 "monitorInterval"을 사용하여 정기적으로 내 log4j2.xml을 확인했습니다. 종료 중에 내 바람둥이 나는 메모리 누수 문제를 직면하고있어.이 메모리 누수 문제를 해결하는 방법?log4j2 스레드의 Tomcat 메모리 누수 문제

06 ~ 10 2016 15 : 13 :

아래는 카탈 로그로 경고 55.927 [로컬 호스트 - startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads 웹 응용 [mywebapp]가 [Log4j2-Log4j2Scheduled-1]이라는 스레드를 시작한 것으로 보이지만 중지하지 못했습니다. 메모리 누수가 발생할 가능성이 큽니다. 스레드의 스택 추적 : sun.misc.Unsafe.park (기본 메소드) java.util.concurrent.locks.LockSupport.parkNanos (LockSupport.java:215) java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.awaitNanos (AbstractQueuedSynchronizer.java:2078) java.util.concurrent.ScheduledThreadPoolExecutor $ DelayedWorkQueue.take (ScheduledThreadPoolExecutor.java:1093) java.util.concurrent.ScheduledThreadPoolExecutor $ DelayedWorkQueue.take (ScheduledThreadPoolExecutor.java:809) 있는 java.util. concurrent.ThreadPoolExecutor.getTask (ThreadPoolExecutor.java:1067) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1127) java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) 자바 .엘 ang.Thread.run (Thread.java:745)

미리 감사드립니다. .. 나는 실제로 로거 문맥 Log4jServletContextListener가 파괴되면 다시 initilising되고, 내 로그를 분석

2016년 10월 22일 13 :

업데이트 49 : 36347 로컬 호스트-startStop-2 DEBUG Log4jServletContextListener는 보장 Log4j가 올바르게 종료됩니다. 2016년 10월 22일 13 : 49 : 실제로 36,382 - 로컬 호스트 startStop -2- DEBUG 시작 LoggerContext [NAME = bb4719, [email protected]] ...

내 응용 프로그램에서는 web.xml에서 Spring ContextLoaderListner를 사용하므로 내부적으로 로깅을 사용하여 스프링 리스너를 파손시킬 수 있습니다.

감사합니다.

+0

catalina 속성 또는 log4j라는 줄을 붙여 넣을 수 있습니까? – bhantol

+0

https://issues.apache.org/jira/browse/LOG4J2-1259 – bhantol

+0

나는 log4j2-1259를 들여다 보았다. 결론을 제대로 얻지 못했다. – Reetika

답변

4

그래야합니다.

빌드시 log4j-web을 포함해야합니다.

예를 들어 종속성 종속성.

(한 특정 항아리에 ServletContainerInitializer를 검색하기 위해 Tomcat을 생략하지 않은 것처럼)
<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-web</artifactId> 
</dependency> 

당신은 서블릿 3.0 컨테이너 또는 추가 구성이 필요하지 않습니다 (톰캣 8과 같은) 새로운를 사용하는 경우. 자세한 내용은 Using Log4j 2 in Web Applications을 참조하십시오.


UPDATE

와 내가 트라이 d 개를 가지고 당신 (톰캣 8.0.38, Log4j를-2.6.2)를 설정하고 작동합니다. Log4jServletContextListenerLog4jServletFilter이 초기화 된 경우 확인하려면 log4j2.xml에서 StatusLogger 수준을 DEBUG으로 설정하십시오.

<Configuration monitorInterval="30" status="DEBUG"> 

그 후 앱을 배포 할 때 루트 로거 appender에서 다음 출력을 볼 수 있어야합니다.

2016-10-14 20:21:36,762 RMI TCP Connection(2)-127.0.0.1 DEBUG Log4jServletContextListener ensuring that Log4j starts up properly. 
2016-10-14 20:21:36,764 RMI TCP Connection(2)-127.0.0.1 DEBUG Log4jServletFilter initialized. 

앱을 다시 배포하면 로그에 다음 줄이 표시됩니다.

2016-10-14 20:22:00,276 RMI TCP Connection(2)-127.0.0.1 DEBUG Log4jServletFilter destroyed. 
2016-10-14 20:22:00,286 RMI TCP Connection(2)-127.0.0.1 DEBUG Log4jServletContextListener ensuring that Log4j shuts down properly. 

로그가 표시되지 않는 경우 jarsToSkip에 log4j2의 jar가 포함되어 있거나 web.xml에 false 값이있는 isLog4jAutoInitializationDisabled 매개 변수를 정의한 경우 catalina.properties를 확인해야합니다.

<context-param> 
    <param-name>isLog4jAutoInitializationDisabled</param-name> 
    <param-value>false</param-value> 
</context-param> 
+0

@Reetika이 문제가 해결되면 수락하십시오. – bhantol

+0

서블릿 3.0 컨테이너를 사용하고 있습니다.하지만 여전히 메모리 누수 문제가 있습니다. log4j2 doc에서 언급 한대로 catalina.properties도 변경되었습니다. – Reetika

+0

@Reetika, 사용중인 log4j2 및 Tomcat 8의 버전을 정확히 알려주십시오. –