2013-10-07 54 views
3

我正在使用SLF4J進行日誌記錄(使用Log4J)。 使用的appender使用xml進行配置。slf4j,更改記錄器或在運行時添加appender

<appender name="business" class="org.apache.log4j.RollingFileAppender"> 
    <param name="maxFileSize" value="10MB" /> 
    <param name="maxBackupIndex" value="10" /> 
    <param name="File" value="${jboss.server.log.dir}/business.log" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d %p [%t] %c - %m%n" /> 
    </layout> 
</appender> 
<category name="BusinessLogger" additivity="false"> 
    <level value="INFO" /> 
    <appender-ref ref="business" /> 
</category> 

日誌進程在攔截器中調用。現在,我正在嘗試測試日誌的輸出。

private static final Logger BUSINESS_LOGGER = LoggerFactory.getLogger("BusinessLogger"); 

爲了測試日誌(使用JUnit),需要在某處被保存爲變量日誌的輸出:我使用稱之爲記錄器在運行時。我有一個創建自定義appender的想法,它將最後一個日誌保存到變量中,但似乎無法添加appender或更改appender,因爲slf4j中的Logger類是一個接口。有沒有人可能知道任何解決方法?

回答

1

讓我有種從alterfox幫助解決它。

當我使用SLF4J稱爲記錄:

private static final Logger BUSINESS_LOGGER = LoggerFactory.getLogger("BusinessLogger"); 

它返回我從SLF4J記錄器適配器,它不具有添加附加器方法的實現。所以我使用log4j記錄器調用記錄器類

private static final Logger BUSINESS_LOGGER = Logger.getLogger("BusinessLogger") 

即使類名是「Logger」,它們來自不同的包。後者是Log4J方法,它從Log4J返回實際的Logger對象。然後addAppender方法變爲可用。那麼,我試過這個,它不起作用(除了它)。事情是,我忘了設置日誌級別。所以在添加appender之後,我設置了日誌級別,然後我看到日誌通過第二個appender。

+0

不客氣:-) – alterfox

+0

如果你的代碼直接使用slf4j(LoggerFactory。getLogger()),這會失敗,因爲您正在向log4j添加處理程序,如果直接調用slf4j,該處理程序將不會使用。 –

0

您可以使用控制檯appender並重定向您的控制檯輸出。看到這篇文章的更多細節:Redirect console output to string in java

此外,您可以使用您的文件appender,然後從文件中讀取日誌,當你需要檢查它。

而對於結束,看看這是否可以成爲對你有所幫助:PropertyConfigurator

+0

是的,我知道這一點。但有沒有辦法在運行時添加appender到slf4j記錄器實例? – Rowanto

+0

@Rowanto我認爲你需要爲這個具體的實現工作。例如。 Logger.getLogger(「BusinessLogger」)。addAppender(...),其中Logger來自org.apache.log4j。考慮一下你的例子是否需要添加_at runtime_。 – alterfox

+0

我不想讓自定義appender在生產環境中運行。這只是,當用junit測試時,我想在測試中附加一個自定義appender,以便我可以測試日誌輸出。我也嘗試過直接調用這個對象,它不起作用。 – Rowanto

2

這看起來很簡單,但是我發現當我遇到這個錯誤時,我忘記了將粘合劑包放入我的POM中以供我的應用程序使用。

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>1.7.7</version> 
    </dependency> 
+0

沒有這個導入,我得到錯誤'org.apache.log4j.Logger.addAppender()適用於參數類型:(org.apache.log4j.FileAppender)'。如果log4j類沒有正確設置,請確保檢查日誌記錄實施。 – tmarthal