2013-03-15 34 views
1

我在我的每個班兩個log4j的記錄器在我的代碼:如何阻止我的日誌文件相互添加?

logA = Logger.getLogger(com.some.class.in.my.project); 
logB = Logger.getLogger('perf'); 

我想這兩個記錄儀輸出數據到兩個完全不同的文件。我似乎無法得到它的工作。

這裏是我的log4j屬性:

log4j.rootLogger = myAppenderA 


    # A 
    log4j.appender.myAppenderA=org.apache.log4j.RollingFileAppender 
    log4j.appender.myAppenderA.File=../logs/mylogfileA.log 
    log4j.appender.myAppenderA.additivity=false 
    log4j.appender.myAppenderA.Threshold=DEBUG 
    log4j.appender.myAppenderA.layout=org.apache.log4j.PatternLayout 
    log4j.appender.myAppenderA.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n 


    # perf 
    log4j.appender.perf=org.apache.log4j.RollingFileAppender 
    log4j.appender.perf.File=..logs/perf.log 
    log4j.appender.perf.additivity=false 
    log4j.appender.perf.Threshold=DEBUG 
    log4j.appender.perf.layout=org.apache.log4j.PatternLayout 
    log4j.appender.perf.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n 

    log4j.logger.myAppenderB = perf 

兩個myLogfileA.logperf.log包含相同的數據。假設設置可加性錯誤修正了這一點,但我已經嘗試過了,它幾乎沒有影響。

回答

2

加法性是記錄器不屬於appender的屬性,因此您必須從appender中刪除additivity屬性並將其添加到記錄器配置中。

目前,您只有文件中的rootLogger配置(並且您沒有爲其定義日誌記錄級別),因此所有記錄器都會從中擴展appender。要停止記錄消息傳播到祖先,必須使用記錄器上的additivity屬性。因此,要達到你想要什麼,你有:

  1. rootLogger定義多了一個附加器(root)。這將是默認的和其他記錄器繼承了沒有additivity = false
  2. 分配myAppenderA附加器來mypackage.MyClass記錄
  3. 分配pref附加器來pref記錄
  4. myAppenderAadditivitypref伐木者false停止日誌消息傳播給祖先記錄器。

有孔屬性文件:

log4j.rootLogger = DEBUG, root 


# Root 
log4j.appender.root=org.apache.log4j.RollingFileAppender 
log4j.appender.root.File=logs/mainLogInheritable.log 
log4j.appender.root.Threshold=DEBUG 
log4j.appender.root.layout=org.apache.log4j.PatternLayout 
log4j.appender.root.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n 


# A 
log4j.appender.myAppenderA=org.apache.log4j.RollingFileAppender 
log4j.appender.myAppenderA.File=logs/mylogfileA.log 
#log4j.appender.myAppenderA.additivity=false 
log4j.appender.myAppenderA.Threshold=DEBUG 
log4j.appender.myAppenderA.layout=org.apache.log4j.PatternLayout 
log4j.appender.myAppenderA.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n 


# perf 
log4j.appender.perf=org.apache.log4j.RollingFileAppender 
log4j.appender.perf.File=logs/perf.log 
#log4j.appender.perf.additivity=false 
log4j.appender.perf.Threshold=DEBUG 
log4j.appender.perf.layout=org.apache.log4j.PatternLayout 
log4j.appender.perf.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n 


log4j.logger.mypackage.MyClass = DEBUG, myAppenderA 
log4j.logger.perf = DEBUG, perf 

log4j.additivity.perf = false 
log4j.additivity.mypackage.MyClass = false 

爲了測試是否是記錄到三個不同的文件,你可以試試這個:

Logger.getLogger("mypackage.MyClass").debug("1111"); 
Logger.getLogger("perf").debug("2222"); 
Logger.getLogger("anyName").debug("3333"); 
+0

沒有遺憾,這是行不通的。此屬性文件配置僅將所有appender的數據發送到logs/mylogfileA.log文件。並沒有觸及表演。 – 2013-03-18 10:58:23

+0

你是如何創建你的記錄器?我編輯了答案,以顯示如何使用記錄器將消息打印到3個不同的文件。 – jonasnas 2013-03-18 14:22:25

+0

P.S.我也改變了日誌位置(刪除'..',我認爲它應該是'../'不是'..')所以請確保你正在尋找合適的位置 – jonasnas 2013-03-18 14:27:05

相關問題