在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的輸出級別。