2016-10-06 69 views
2

私はlog4j2をログ、tomcat8、java8のバージョンに使用しています。 私はlog4j2.xmlを定期的にチェックするために "monitorInterval"属性を使用しました。 シャットダウン中にTomcatがメモリリークの問題に直面しています。このメモリリークの問題を解決するにはどうすればよいですか?log4j2スレッドのTomcatメモリリークの問題

以下

はCatalinaのログである:

06 10月、2016 15:13:55.927 WARNING [ローカルホスト-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Webアプリケーション[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) のjava .l ang.Thread.run(Thread.java:745)

ありがとうございます。 ..私は実際にロガーコンテキストがLog4jServletContextListenerが破壊された後、再びinitilisingされ、私のログを解析し

2016年10月22日13:

更新日49:36347 localhostを-startStop-2 DEBUG Log4jServletContextListenerがあることを保証しますLog4jは正常にシャットダウンします。 2016年10月22日13:49:実際には36382 localhostを-startStop-2 DEBUG開始 LoggerContext [名= bb4719、 [email protected]] ...

私のアプリケーションでは、web.xmlでSpring ContextLoaderListnerを使用しているため、Spring Listnerを破棄しながら内部的にログを使用する可能性があります。

ありがとうございました

+0

カタリーナのプロパティーを貼り付けたり、log4jという行を貼り付けたりできますか? – bhantol

+0

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

+0

私はlog4j2-1259を調べましたが、結論を正しく得られませんでした。 – Reetika

答えて

4

これは動作するはずです。

log4j-webがビルドに含まれていることを確認してください。

たとえば、依存関係として。

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

あなたが(Tomcatの8のように)サーブレット3.0コンテナ以降を使用している場合は追加の設定は(限り、あなたは、特定の瓶にServletContainerInitializerをスキャンするためにTomcatを省略していないとして)必要ありません。詳細はUsing Log4j 2 in Web Applicationsを参照してください。


UPDATE

と私はトライDそれを持って、あなた(のTomcat 8.0.38、Log4jの-2.6.2)を設定し、それが動作します。 Log4jServletContextListenerLog4jServletFilterが初期化されているかどうかを確認するには、log4j2.xmlStatusLoggerレベルをDEBUGに設定します。

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

その後、アプリケーションのデプロイ時に、ルートロガーアペンダーで以下の出力が表示されるはずです。

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のcontainer.Butを使用していますが、まだメモリリークの問題に直面しています。私はlog4j2 docで述べたようにcatalina.propertiesも変更しました。 – Reetika

+0

@Reetika、使用しているlog4j2とTomcat 8のバージョンを正確に教えてください。 –