在Log4J中存在幾個概念首先介紹一下,最最重要的兩個是Logger和Appender (請參考Log4J手冊),其實是繼承層次以及輸出控制。
首先Log4J中總是存在一個rootLogger,即使沒有顯示配置也是存在的,並且 默認輸出級別為DEBUG。
其它的logger都繼承自這個rootLogger(如果其他logger未單獨定義其輸出 級別)。
Log4J中的層次是用'.'來分隔的,如log4j.logger.com.example.test,這裡 並不是說log4j.logger後面一定是具體的包名乃至類名,
這個名稱可以自定義,我們甚至可以定義一個log4j.logger.A.B.C, 在 com.example.test中的類裡取名稱為A.B的logger,如
Logger logger = Logger.getLogger("A.B")
上例中我們建立了3個logger實例,它們分別是"A"、 "A.B"、"A.B.C"。每次我們在系統中取得logger時,並不 是新建實例,這些實例是
系統啟動的時候就按照配置文件初始化好的(也可能時第一次引用的時候建 立的,然後緩存其實例供以後使用,這部分還沒有時間研究)。
限制appender疊加性
例1:
log4j.rootLogger=DEBUG, Console
log4j.logger.A=DEBUG, Console
log4j.logger.A.B=INFO, Console
對於logger A.B輸出的任何日志會往控制台輸出三次,原因是A.B繼承A的以 及A的父logger的所有appender,
這種繼承關系僅僅是把父logger的appender添加到自己的appender列表中, 父logger的輸出level不會影響
子logger的輸出。
例2:限制appender疊加
log4j.rootLogger=DEBUG, Console
log4j.logger.A=DEBUG, Console
log4j.logger.A.B=INFO, Console
log4j.additivity.A.B=false
logger A.B的日志僅會輸出到自己Console中,不會繼承任何父logger的 appender。
控制appender的輸出級別
若想對輸出到appender中的日志級別進行限制的話,就需要用到threshold來 控制。
log4j.threshold=ERROR 用來控制所有的appender,即輸出到所有appender 的日志,
不管原來是什麼級別的,都不能低於threshold所規定的級別。
log4j.appender.Console.threshold=ERROR 用來控制指定的appender的輸出 級別。