2015-05-07 59 views
0

從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)中。

回答

1

必須添加log4j ConsoleAppender。這可能是春天,因爲我知道他們做了一些伐木技巧。在啓動過程中,您可以嘗試傳遞-Dorg.jboss.as.logging.per-deployment=false,如果找到了log4j.xml或log4j.properties文件,應該禁用JBoss EAP嘗試配置log4j。

另一個選項可能是在日誌子系統中將add-logging-api-dependencies設置爲false。您需要在部署中包含log4j庫,因爲它看起來有些依賴於它。以下是CLI將更改默認設置的樣子。

/subsystem=logging:write-attribute(name=add-logging-api-dependencies,value=false) 

請注意,禁用此功能會影響所有部署。

這就是說問題是log4j ConsoleAppender的工作方式。它總是直接登錄到System.xxx。 JBoss EAP在記錄器中包含stdoutstderr,這是導致死鎖的原因。

有一個修復程序應該在某個時候發佈在6.4版本中。

+0

James,在與Devel團隊合作之後,他們從代碼中刪除了所有的System.out.println,似乎問題不再發生。你是對的,他們正在使用彈簧進行開發。 – alphamikevictor

+1

FWIW如果正在使用log4j ConsoleAppender,'System.out.println'語句應該只是一個問題。這應該全部在'org.jboss.logging:log4j-jboss-logmanager:1.1.2.Final'中修復。用新版本替換該模塊庫應該是安全的。 –