從Jboss 5升級到Jboss EAP 6.3.0後,我們發現應用程序在運行一段時間後失敗。看看它開始增加接受HTTP請求但無法服務它們的線程數量。之後,一個ThreadDump表明我們的log4j死鎖:Jboss EAP 6.3線程通過log4j獲得死鎖ConsoleAppender
Found one Java-level deadlock:
=============================
"http-/0.0.0.0:39002-109":
waiting to lock monitor 0x0000000013d2a218 (object 0x00000000c1cc7aa8, a org.apache.log4j.ConsoleAppender),
which is held by "http-/0.0.0.0:39002-12"
"http-/0.0.0.0:39002-12":
waiting to lock monitor 0x000000001456c128 (object 0x00000000c1cca400, a java.io.PrintStream),
which is held by "http-/0.0.0.0:39002-74"
"http-/0.0.0.0:39002-74":
waiting to lock monitor 0x0000000013d2a218 (object 0x00000000c1cc7aa8, a org.apache.log4j.ConsoleAppender),
which is held by "http-/0.0.0.0:39002-12"
與開發團隊說起log4j的所有引用的應用程序只留下standalone.xml IR的順序配置一些類記錄到一些特定的文件內被拆除,這是相關的配置有關記錄:
<periodic-rotating-file-handler name="FILE" autoflush="true">
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
<size-rotating-file-handler name="DocumentalServices">
<file relative-to="jboss.server.log.dir" path="DocumentalServices.log"/>
<rotate-size value="10m"/>
<max-backup-index value="5"/>
</size-rotating-file-handler>
<size-rotating-file-handler name="DataServices">
<file relative-to="jboss.server.log.dir" path="DataServices.log"/>
<rotate-size value="10m"/>
<max-backup-index value="5"/>
</size-rotating-file-handler>
<size-rotating-file-handler name="Audit">
<file relative-to="jboss.server.log.dir" path="audit.log"/>
<rotate-size value="10m"/>
<max-backup-index value="5"/>
</size-rotating-file-handler>
<logger category="com.documentation.framework.ws" use-parent-handlers="false">
<level name="DEBUG"/>
<handlers>
<handler name="DocumentalServices"/>
</handlers>
</logger>
<logger category="com.documentation.framework.data" use-parent-handlers="false">
<level name="DEBUG"/>
<handlers>
<handler name="DataServices"/>
</handlers>
</logger>
<logger category="com.documentation.framework.core.audit" use-parent-handlers="false">
<level name="DEBUG"/>
<handlers>
<handler name="Audit"/>
</handlers>
</logger>
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="FILE"/>
</handlers>
</root-logger>
似乎有點怪的是ConsoleAppender僵局,以記住我們不是記錄到根記錄器內的控制檯上,只到文件(server.log)中。
James,在與Devel團隊合作之後,他們從代碼中刪除了所有的System.out.println,似乎問題不再發生。你是對的,他們正在使用彈簧進行開發。 – alphamikevictor
FWIW如果正在使用log4j ConsoleAppender,'System.out.println'語句應該只是一個問題。這應該全部在'org.jboss.logging:log4j-jboss-logmanager:1.1.2.Final'中修復。用新版本替換該模塊庫應該是安全的。 –