2017-12-28 75 views
0

私はこれを解決するためにあらゆるところを探しましたが、今は本当に問題かどうか疑問に思っています。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

見つけることができます。再配備では、戦争からロードされたすべてのクラスをアンロードしませんでした。 – tsolakp

+0

そこには方法がありますか?実稼働環境では、すべてのデプロイメント更新時にサーバーを再起動するか、少なくともn個の再配布を再起動する必要があります。おそらく別のサーバーを使用しているはずですか? – Christian

+0

もう一度Tomcatの新しいバージョンが動作するかどうかはわかりませんが、新しい展開ごとにTomcatを再起動しなければならないことは覚えています。それは6〜7年前でした。 – tsolakp

答えて

1

@RemkoPopmaのアドバイスとTomcat JIRAボードの@RalphGoersの助けを借りて、私自身の質問に答えてください。

pom.xmlには、coreapiもインポートされ、Log4J2の適切なシャットダウンを処理するだけで、次の依存関係が必要でした。

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

この依存関係のための固有のドキュメントは、Tomcatは、かなりの時間のためにクラスローダのmemotyリークの問題があった

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