Posted on 2007-06-23 09:11
云自無心水自閑 閱讀(800)
評論(0) 編輯 收藏 所屬分類:
Java
Log4j
Log4j的核心是3大組件:Logger、Appender、Layout。
首先是Logger,Logger的意義在于它不象System.out,它可以根據需要屏蔽部分的Log輸出,同時其他的Log輸出不受影響。
一、Logger有層次結構。有了層次結構就意味著有了繼承關系,也就意味著可以重用。這似乎和面向對象語言很想象。
Logger都是有名稱的,而Logger的名稱和Java一樣,也是XXX.XXX.XXX,和Java一樣的規則,相當簡單。類似于Java中的Object,Logger的存在一個默認的根節點:root
Logger的名稱一般這樣獲得:
Logger logger = Logger.getLogger("XXX.XXX.XXX");
或者
Logger logger = Logger.getLogger(this.getClass());
Log4j并沒有強制要求用類名作為Logger的名稱,但是這是推薦的做法。
二、有了層次結構后,就要說一下級別了,文章開始的時候就提到,Log4j的優勢就在于能夠根據需要過濾Log的輸出,主要(不是全部)就是通過級別實現的。
Log4j把級別分為:Fatal,Error,Warn,Info,Debug。這樣的區分也是經過慎重考慮的,如果引入太多的層次,會使得程序開發者在記錄日志的時候,難以選擇,會挑花了眼。
級別之間存在優先級的高低。
通過如下語句,輸出不同級別的Log
logger.debug("...");
logger.info("...");
logger.warn("...");
logger.error("...");
logger.fatal("...");
如果Logger的級別設為Warn,那么只有級別比Warn高的語句的Log才會輸出。 比如:logger.debug語句這時不起作用。
三、層次結構的繼承關系現在便發揮作用了。子節點如果沒有顯式定義級別,那么自動繼承最近的父節點的級別。這樣,就不需要為每一個Logger都去定義級別了,因為至少根節點是存在的,可以從根節點中獲得級別定義。
四、全局級別,可以通過設置日志的“門檻”,來實現全局強制性的級別控制。
LoggerResposity reposity = x.getLoggerResposity();
resposity.setThreshold(Level.WARN); 這完全可以在配置文件中配置。
這樣,logger.info語句將不再起作用。
其次是Appender,Appender決定了Log究竟輸出到什么地方,Log4j提供了多重輸出的功能,也就是說可以為Log定義多個輸出地點。
同樣,層次結構在這里也發揮的威力,子節點的Logger將會繼承父節點的Appender,免去了一個一個定義Appender的工作,根節點默認的Appender的Console。
當然,也可以設置不繼承父節點的Appender
最后是Layout,Layout決定了Log的格式。
Log4j的配置完全可以通過編程實現,對于特別簡單的應用來說,絕對是夠用了。但是,對于稍微大一點的應用,把配置硬編碼在程序中是不靈活的。所以,使用配置配置文件是比較好的選擇。