2016-09-25 56 views
1

我的一個簡單問題是:如果我在Java中使用logger.info()和logger.error()兩個語句(使用log4j),我希望這兩行的結果打印在兩個單獨的文件中。也就是說,logger.info(...)應該打印到一個文件,說myLog.info和logger.error(...)應打印到myLog.error文件。我正在使用滾動文件appender執行此任務。另外我只想要一個記錄器對象來完成這個任務。有人可能會爲每個文件建議兩個或更多不同的記錄器,但事實並非如此。使用同一個對象記錄不同的級別到不同的文件

我試過尋找問題的解決方案。其中一個鏈接Creating multiple log files of different content with log4j說關於「閾值」,我甚至嘗試在我的xml配置文件中添加閾值。但實際上是這樣做的:信息日誌正在打印在myLog.info文件中,但錯誤日誌打印在兩個文件中。它可以通過單獨的XML配置文件來完成,還是需要單獨的屬性文件?如果xml文件足夠,那麼需要做什麼?

我更喜歡在屬性文件上的xml文件。如果只有使用xml配置文件的工作解決方案,那就足夠了。提前致謝。

+0

看看這是否有幫助.. http://stackoverflow.com/questions/9652032/how-can-i-create-2-separate-log-files-with-one-log4j-config-file – mhasan

+0

@mhasan其實我正在尋找涉及xml配置文件的答案......但我也會嘗試。謝謝 –

+0

@mhasan還有一件事,只是看着答案,我意識到它實際上是製作兩個不同的記錄器......我只想要一個記錄器輸出不同級別的日誌到不同的文件。 –

回答

1

您可以使用過濾器來拒絕除您想要的級別以外的任何消息。這裏是如何做到這一點的例子:

第一類來測試我們的努力:

package test; 
import org.apache.log4j.Logger; 

public class Main { 

    private static final Logger logger = Logger.getLogger(Main.class); 
    public static void main(String[] args) { 
     logger.debug("here's some debug"); 
     logger.info("here's some info"); 
     logger.warn("here's some warn"); 
     logger.error("here's some error"); 
     logger.fatal("here's some fatal"); 
    } 

} 

下一個的log4j.xml配置文件來設置附加目的地和伐木者:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> 
    <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" /> 
     </layout> 
    </appender> 

    <appender name="debugLog" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="logs/debug.log" /> 
     <param name="Append" value="true" /> 
     <param name="MaxFileSize" value="5000KB" /> 
     <param name="maxBackupIndex" value="5" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p - %m%n" /> 
     </layout> 

     <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
      <param name="LevelToMatch" value="DEBUG" /> 
      <param name="AcceptOnMatch" value="true" /> 
     </filter> 

     <filter class="org.apache.log4j.varia.DenyAllFilter" /> 
    </appender> 

    <appender name="infoLog" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="logs/info.log" /> 
     <param name="Append" value="true" /> 
     <param name="MaxFileSize" value="5000KB" /> 
     <param name="maxBackupIndex" value="5" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p - %m%n" /> 
     </layout> 

     <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
      <param name="LevelToMatch" value="INFO" /> 
      <param name="AcceptOnMatch" value="true" /> 
     </filter> 

     <filter class="org.apache.log4j.varia.DenyAllFilter" /> 
    </appender> 

    <logger name="test" additivity="false"> 
     <level value="DEBUG" /> 
     <appender-ref ref="consoleAppender" /> 
     <appender-ref ref="debugLog" /> 
     <appender-ref ref="infoLog" /> 
    </logger> 
</log4j:configuration> 

這種模式將允許您爲每個日誌級別生成單獨的日誌,只需重複我提供的用於調試或信息日誌記錄的配置即可。請注意,控制檯appender將接受所有級別。

我能從this post獲得一些見解,所以我認爲我應該給予信任。

+0

我搜索瞭解決方案,但沒有提到使用級別匹配過濾器的方式。這個工作得很好。謝謝。 :) –

相關問題