2010-06-11 57 views
4

爲什麼我的應用程序中的Log4jrootLogger未按照級別篩選日誌事件?在我log4j.properties,我有幾個伐木工人:爲什麼Log4j rootLogger不根據事件級別過濾日誌事件?

log4j.rootLogger=info,stdout 
log4j.logger.com.name.myapp=debug,myapp 
log4j.logger.org.castor=debug,castor 
log4j.logger.org.exolab.castor=debug,castor 
log4j.logger.org.hibernate=debug,hibernate 
log4j.logger.org.springframework=debug,spring 

每個記錄儀的接收和水平DEBUG以上,這是我期待和願望記錄大量的日誌事件。然而,rootLogger儘管設置爲INFO,但也顯示所有這些事件,包括DEBUG事件,這不是我所期望的,也不是我所期望的。相反,我期望它會過濾DEBUG事件,但只顯示級別爲INFO和更高的事件(WARN,ERRORFATAL),這也是我想要的。爲什麼rootLogger顯示所有事件?

+0

你已經提供了com.name.myapp,org.castor,org.hibernate,org.springframework的調試級別,所以對於這些pkgs它會打印調試信息嗎? – Inv3r53 2010-06-11 14:47:24

+0

是的,這些級別打印調試事件。但是,rootLogger打印所有事件,但我希望它只打印信息事件。 – 2010-06-11 15:22:45

+0

然後將等級更改爲信息。 – Inv3r53 2010-06-11 17:44:59

回答

5

看到這個answer一個類似question有關記錄在Log4j的鏈接:

的方式Log4j的鏈接的作品有點 直覺(至少對我來說)。如果 的請求級別等於或高於 匹配記錄器的最具體的 的閾值,則它被接受。一旦 該請求被接受,它將得到 由 祖先的完整鏈處理,而不管它們的 閾值!

這意味着,不管你設置什麼級別的根記錄器的閾值時,總是會接受和輸出的日誌事件,任何其他記錄器接受,除非你禁用鏈接爲孩子記錄儀或明確設置其appender的門檻更高一級。

因此,在這種情況下,有兩種方法可以防止根記錄器捕獲來自其他記錄器的事件。第一是禁用日誌事件鏈的多選擇性的方法:

log4j.additivity.com.name.myapp=false 
log4j.additivity.org.castor=false 
log4j.additivity.org.exolab.castor=false 
log4j.additivity.org.hibernate=false 
log4j.additivity.org.springframework=false 

第二種方法是簡單的,但更嚴格,因爲它抑制是在控制檯上的所有事件低於INFODEBUGTRACE):

log4j.appender.stdout.Threshold=info 
1

查看intro中描述的繼承。如果您在包級別指定級別,則它不會繼承根記錄器的級別。你在你指定的包中使用調試,而不是信息。指定級別將覆蓋已被繼承的任何級別。

如果您想繼承根記錄器的級別,請刪除記錄器配置中的級別規格。

+0

我不希望軟件包繼承根記錄器級別。我希望根記錄器省略調試事件,並僅向控制檯顯示以上信息。 – 2010-06-11 15:24:50

+0

@Derek Mahar簽出http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html。使用%c來查看你的關卡真的在做什麼。你應該能夠通過這種方式追蹤更好的情況。 – 2010-06-11 15:36:11

+0

'%c'是否輸出首次接受事件的記錄器? – 2010-06-12 11:38:21

2

要檢索rootlogger,你使用的是Logger.getRootLogger()?如果沒有,你可能沒有得到真正的根記錄器。如果是這樣,請確保stdout的閾值不在調試中; appenders的閾值優先於記錄器級別的閾值。

+0

appender的默認優先級是多少?是「全部」嗎? – 2010-06-13 12:39:16

+0

對不起,我的意思是Threshold。你在下面找到的答案是正確的。 – Mornedhel 2010-06-14 19:24:34

+0

你的答案是正確的,但正如我在我的答案中提到的(http://stackoverflow.com/questions/3023690/why-is-log4j-rootlogger-not-filtering-log-events-according-to-event級別/ 3024279#3024279),兩種可能的解決方案之一是將appender stdout的閾值設置爲INFO。 – 2010-06-14 19:39:09