2017-12-28 1 views
0

저는이 문제에 대한 해결책을 찾기 위해 모든 곳에서 수색했습니다. 이제 정말 문제인지 궁금해지기 시작했습니다.Log4j2 메모리 누수

log4j2을 내 응용 프로그램에 로거로 소개하고 있는데, 그렇게 할 때 Tomcat 서버 8.5.24를 다시로드, 배포 취소 또는 중지 할 때 메모리 누수가 남았습니다. 코드로 pom.xml에서

내 의존성 :

<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-api</artifactId> 
    <version>2.10.0</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-core</artifactId> 
    <version>2.10.0</version> 
</dependency> 

WebServlet :

import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.LogManager; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 
import java.io.PrintWriter; 

@WebServlet(name = "Servlet", urlPatterns = {"/servlet"}, loadOnStartup = 1) 
public class Servlet extends HttpServlet { 

    private final Logger logger = LogManager.getLogger(Servlet.class); 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     logger.info("doGet"); 

     PrintWriter out = response.getWriter(); 
     out.print("Servlet loaded"); 
     out.flush(); 
     out.close(); 
    } 

} 

log4j2.xml :

:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration> 
    <Appenders> 
     <Console name="Console"> 
      <PatternLayout pattern="%d %p %c %m%n" /> 
     </Console> 
     <File name="File" bufferedIO="true" fileName="logs/log4j2-file-sync-${date:HH:MM:ss.SSS}.log"> 
      <PatternLayout pattern="%d %p %c %m%n" /> 
     </File> 
    </Appenders> 
    <Loggers> 
     <Root level="all" includeLocation="false"> 
      <AppenderRef ref="Console" /> 
      <AppenderRef ref="File" /> 
     </Root> 
    </Loggers> 
</Configuration> 

이것은 내가지고있어 오류입니다

The following web applications were stopped (reloaded, undeployed), but their 
classes from previous runs are still loaded in memory, thus causing a memory 
leak (use a profiler to confirm): 
/myapp 
+0

Tomcat이 꽤 많은 시간 동안 문제를 누출 memoty 클래스 로더를 가지고 찾을 수 있습니다. 재배치시 전쟁에서 적재 된 모든 클래스를 언로드하지 않을 것입니다. – tsolakp

+0

주위에 방법이 있습니까? 프로덕션 환경에서는 모든 배포 업데이트마다 서버를 다시 시작해야하며 적어도 모든 n 명의 사용자가 다시 배포해야합니다. 아마도 다른 서버를 사용해야할까요? – Christian

+0

Tomcat의 최신 버전이 제대로 작동하는지 확신 할 수 없지만 새로운 배포가있을 때마다 Tomcat을 다시 시작해야한다는 것을 기억합니다. 그것은 6-7 년 전이었습니다. – tsolakp

답변

1

Tomcat JIRA 게시판의 @RalphGoers 및 @RemkoPopma의 조언 덕분에 내 질문에 답변 할 수 있습니다.

pom.xml에는 다음과 같은 종속성 만 있으면 coreapi을 가져오고 Log4J2의 적절한 종료를 처리합니다.

<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-web</artifactId> 
    <version>2.10.0</version> 
</dependency> 

이 의존성에 대한 특정 문서는

https://logging.apache.org/log4j/2.x/manual/webapp.html