云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Log4j 簡要剖析

          Posted on 2007-06-23 09:11 云自無心水自閑 閱讀(801) 評論(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的配置完全可以通過編程實現,對于特別簡單的應用來說,絕對是夠用了。但是,對于稍微大一點的應用,把配置硬編碼在程序中是不靈活的。所以,使用配置配置文件是比較好的選擇。



          主站蜘蛛池模板: 仪陇县| 永嘉县| 綦江县| 天柱县| 乌恰县| 盐边县| 临沂市| 台中市| 富源县| 三都| 霍林郭勒市| 启东市| 芷江| 宣武区| 乐安县| 合川市| 北碚区| 苏尼特左旗| 乡城县| 瑞昌市| 新田县| 湖口县| 玛多县| 潮州市| 高邮市| 夹江县| 图们市| 乐东| 天长市| 平陆县| 施秉县| 江达县| 德惠市| 凤庆县| 乌苏市| 柳河县| 乌海市| 福清市| 涟水县| 牡丹江市| 建平县|