2016-11-07 149 views
3

我有一個在Jboss EAP 7.0.2上運行的web應用程序。在我的應用程序中,我想使用Log4j2進行日誌記錄。所以,我說log4j2log4j-slf4j-impl作爲依賴:Log4j2和Jboss EAP 7:異常日誌記錄

的build.gradle

compile 'org.apache.logging.log4j:log4j-core:2.7' 
compile 'org.apache.logging.log4j:log4j-api:2.7' 
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.7' 

認沽文件JBoss的部署,structure.xml

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure> 
    <deployment> 
     <exclude-subsystems> 
      <subsystem name="logging" /> 
     </exclude-subsystems> 
     <exclusions> 
      <module name="org.apache.commons.logging" /> 
      <module name="org.apache.log4j" /> 
      <module name="org.jboss.logging" /> 
      <module name="org.jboss.logging.jul-to-slf4j-stub" /> 
      <module name="org.jboss.logmanager" /> 
      <module name="org.jboss.logmanager.log4j" /> 
      <module name="org.slf4j" /> 
      <module name="org.slf4j.impl" /> 
     </exclusions> 
    </deployment> 
</jboss-deployment-structure> 

創建log4j2.xml(我省略了它的內容,但它將日誌寫入文件lea.log)。

另外,我有TestRestService

@Path("/test") 
public class TestRestService { 
    private Logger logger = LogManager.getFormatterLogger(TestRestService.class); 
    private org.slf4j.Logger slf4jLogger = LoggerFactory.getLogger(TestRestService.class); 

    @GET 
    @Path("/logger") 
    public void testLogger() { 
     logger.info("Log4j2 log"); 
     slf4jLogger.info("SLF4J log"); 
     throw new RuntimeException("Test"); 
    } 
} 

這種測試方法寫入lea.log

2016-11-07 15:25:37.673 [default task-7] INFO ru.rshb.test.TestRestService - Log4j2 log 
2016-11-07 15:25:37.673 [default task-7] INFO ru.rshb.test.TestRestService - SLF4J log 

,但它不記錄異常!

在server.log中我看到:

2016-11-07 15:25:37,673 INFO [stdout] (default task-7) INFO - Log4j2 log 

2016-11-07 15:25:37,673 INFO [stdout] (default task-7) INFO - SLF4J log 

2016-11-07 15:25:37,674 ERROR [io.undertow.request] (default task-7) UT005023: Exception handling request to /lea-core/rest/test/logger: org.jboss.resteasy.spi.UnhandledException: java.lang.RuntimeException: Test 
... 

問題:

  1. 我如何可以將所有消息,並在我的應用程序lea.log發生異常(我log4j2日誌文件)?
  2. 即使我從部署中排除日誌子系統,它是否會記錄到server.log文件?

回答

0

你從REST端點拋出異常並且不處理它。因此,服務器爲您處理它,無法登錄到您的應用程序日誌配置。

排除日誌子系統將停止您的部署被日誌子系統處理。 (這意味着你不需要這些模塊排除)。但是,服務器本身仍將使用日誌子系統中的配置。

如果您想要捕獲特定類型的異常,則可以使用javax.ws.rs.ext.ExceptionMapper來記錄異常,然後爲其創建響應。

+0

謝謝你的回答。 它並不吸引我在我的應用程序中捕獲所有異常。我想要實現的是使用Log4j2的路由記錄功能(或SiftingAppernder,因爲它在Logback中被稱爲)。根據我的理解,缺省日誌子系統中沒有篩選功能。所以,我猜,對我來說最好的選擇是將Logback作爲服務器日誌框架(就像它在[這裏]描述的一樣)(http://blog.anotheria.net/devops/enable-logback-in-jboss/),例)。是對的嗎? – 3biga

+0

這可能適用於WildFly本身,但是如果其他依賴項使用log4j或JUL,那麼您可能不會將這些日誌消息指向logback。 –

+0

好的,謝謝你的幫助! – 3biga