隨筆-159  評論-114  文章-7  trackbacks-0
          原文地址http://java.sys-con.com/read/48541.htm

          北國狼人 翻譯

          哪一個庫更適合你呢?
          ?
          摘要
          ?
          你的Java程序是否被很多隨即放置的System.out.println語句和stack traces(例如:ex.printStackTrace())弄亂呢?當(dāng)你加入調(diào)試信息到工程中的類中,你的信息輸出是否穿插于其他開發(fā)者的很多信息中,使得您的信息很難辨認(rèn)和讀取呢?你是否使用簡單的日志API,并擔(dān)心它可能不能提供您需要的足夠的彈性和能力,當(dāng)您的程序已存在于產(chǎn)品中時呢?如果以上的問題的答案都是Yes,到了你該選擇一個工業(yè)級和強(qiáng)大的日志API和使用它的時候了!
          ?
          這篇文章將通過評估兩種廣為使用的Java日志庫:the Apache Group's Log4j和java.util.logging包(使用JUL代替),來幫助您選擇日志API。這個文章調(diào)查了每一個庫如何實(shí)現(xiàn)日志,評價他們的區(qū)別和相似點(diǎn),并提供一些簡單的指導(dǎo)路線,可以幫助您決定選擇哪一個庫。
          ?
          Log4j的介紹
          Log4j是一個開源日志庫,被開發(fā)為Apache Software Foundation's日志服務(wù)項(xiàng)目的一個子項(xiàng)目。基于IBM開發(fā)的日志庫早在1990年,它的第一個版本出現(xiàn)在1999。Log4j是一個廣為使用在開源社區(qū),包括一些大型項(xiàng)目比如JBoss和Hibernate。
          ?
          Log4j的架構(gòu)建立于三個大的概念上面:loggers,appenders,和layouts.(日志子,追加器,布局器)。這些概念允許開發(fā)者記錄信息根據(jù)他們的類型和優(yōu)先級,和來控制信息在哪結(jié)束以及他們的形式。loggers是你的應(yīng)用程序首先調(diào)用的對象,用來初始化信息的日志記錄。當(dāng)loggers被給與一條信息來記錄,loggers生成了Logging-Event對象來進(jìn)行封裝給定信息。該loggers此時交接LoggingEvents給它們關(guān)聯(lián)的appender。Appenders發(fā)送LoggingEvents包含的信息到指定的輸出目的地。例如,一個ConsoleAppender將信息寫到System.out或者一個FileAppender將它附加于一個文件中。在發(fā)送LoggingEvent信息到最后輸出目的地之前,一些appender使用布局器來創(chuàng)建以預(yù)期格式格式化的對于信息的文本表達(dá)。例如,Log4j包括了XMLLayout類來用于格式化loggingEvents以XML的字符串。
          ?
          在Log4j中,LoggingEvent被賦予一個級別來指定他們的優(yōu)先級。在Log4j中的默認(rèn)級別(從高到低):OFF,FATAL,ERROR,WARN,INFO,DEBUG,和ALL.
          Loggers和appenders也被分配到一個級別,并且只有當(dāng)logging請求的級別比他們的級別相等并且更大時,才會執(zhí)行。例如,如果一個appender他的級別是ERROR,它被請求輸出一個有著WARN的級別的LoggingEvent,appender將不會寫出被給與的logEvent。
          ?
          Log4j中的所有l(wèi)oggers有一個名字。Log4j組織logger實(shí)例到一個樹型的結(jié)構(gòu)中,根據(jù)他們名字,同Java語言中的包的組織一樣。正如Log4j的文檔簡潔的表述:“一個logger被認(rèn)為是另外的logger的祖先,如果它的名字緊跟著一個點(diǎn)是后代的這個logger名字的前綴。”例如,一個名為"org.nrdc"被認(rèn)為是"org"logger的子代。"org.nrdc.logging"logger是"org.nrdc" logger的子代,并且是"org" logger的重子代。如果logger的沒有明確的指定級別,它會使用已經(jīng)賦予級別的最近的父輩的級別。Loggers繼承appenders從他們的父類,盡管他們也能被配置只使用直接賦給他們的appender。
          ?
          當(dāng)一個logger被請求來記錄信息,它首先檢查請求的級別是否比它的有效級別相同或者更大。如果是,它就創(chuàng)建LoggingEvent根據(jù)給定的信息,并傳送LoggingEvent到它的appenders,格式它,并發(fā)送它到輸出目的地。
          ?
          JUL的介紹
          ?
          java.util.logging包,Sun在2002年 Java SDK 1.4中介紹了它,作為JSR 47到來的,Logging API 規(guī)范。JUL非常類似于Log4j - 它多多少少的正確的使用了同樣的概念,但是對他們重新命名了。例如,appenders 叫 “handlers”,layout 叫 “formatters”,并且LoggingEvent叫做“LogRecords”。圖片1,匯總了Log4j和JUL的名稱和概念。JUL使用級別與Log4j使用級別是一樣的,并且JUL日志繼承屬性properties從他們父loggers中,有點(diǎn)像Log4j繼承屬性從父層次中。從Log4j到JUL概念幾乎是一對一的;雖然兩個庫在細(xì)節(jié)上有所不同,任何熟悉Log4j的開發(fā)者只需要調(diào)整他們的詞庫就可以理解JUL。
          ?
          功能不同點(diǎn)
          ?
          雖然Log4j和JUL幾乎有同樣的概念,他們在功能上不同。他們的可以歸納為,“無論JUL能不能做成什么,Log4j都能做 - 并且做得更多。”他們主要在幾個領(lǐng)域不同,appender/handler的實(shí)現(xiàn),有用的格式化器/布局實(shí)現(xiàn)器,和配置靈活性上。
          ?
          JUL包含4種具體的handler的實(shí)現(xiàn),而Log4j則包括超過12個的appender實(shí)現(xiàn)。JUL的handler足夠用來進(jìn)行基本的日志記錄 - 他們允許你寫入到一個buffer,一個console,一個socket,和一個file中。Log4j的appenders,另一方面,大概覆蓋了所有l(wèi)ogging輸出目的地你可以想到的。他們可以寫到NT日志或者Unix syslog中,或者甚至發(fā)送Email。圖片2提供了JUL的handler和Log4j的appenders的匯總。
          ?
          JUL包含了兩個格式化類:XMLFormatter和SimpleFormatter。Log4j包含了對應(yīng)的布局器:XMLLayout和SimpleLayout.Log4j還提供了TTCCLayout,它格式化LoggingEvents到富內(nèi)容字符串,和HTMLLayout,它可格式化LoggingEvent到HMTL表格中。
          ?
          TTCCLayout和HTMLLayout都很有用,Log4j的確領(lǐng)先于JUL,在formatter/handler方面,由于PatternLayout。PatternLayout實(shí)例能夠采用一個通過字符轉(zhuǎn)換式模式而帶來具有大量有彈性的被配置,類似于在C中的printf函數(shù)的表達(dá)式類型。在PatternLayout轉(zhuǎn)換式模式中,特定轉(zhuǎn)化字符被用來指定在布局格式化輸出的信息。例如,"%t"被用來指定開始記錄信息的線程;"%C"被用于開始記錄信息的對象的類的名稱;并且"%m"指定了信息。"%t: %m"將導(dǎo)致輸出類似于這樣"main thread:This is my message." "%C - %t:%m"會導(dǎo)致輸出類似于"org.nrdc.My-Class - main thread:This is my message." Pattern-Layout非常有用,然而JUL的兩個formatter類沒有任何地方來匹配這樣的多功能性。對于JUL使用者,自行定制formatter類是很少見,反之大多數(shù)Log4j用戶通常需要學(xué)會如何使用PatternLayout轉(zhuǎn)換式模式。
          ?
          Log4j和JUL同時都能夠使用配置文件進(jìn)行配置,Log4j允許更廣范圍內(nèi)的配置的可能性相對于JUL使用的配置文件。JUL能夠使用.properties文件配置,但是到了J2SE5.0之前,handlers的配置只能是對于每一個類的而不是對于每一個實(shí)例。這就意味著如果你將使用Tiger版本的SDK,你將遺漏有用的配置選擇,例如可以設(shè)置不同的FileHandler實(shí)例發(fā)送他們的輸出到不同的文件中。
          ?
          非常重要的,注意Tiger版的JUL能夠很容易的被配置為寫到多個文件,通過編寫代碼,而不是通過默認(rèn)的配置機(jī)制。Log4j能夠通過.properties文件或者XML文件配置,并且appenders能夠以每一個實(shí)例為基礎(chǔ)進(jìn)行配置。同時,Log4j允許開發(fā)者關(guān)聯(lián)布局實(shí)例和appender實(shí)例,并以每一個實(shí)例為基礎(chǔ)進(jìn)行配置布局。這包括PatternLayout實(shí)例 - 你能夠設(shè)置轉(zhuǎn)換式每一個模式的使用,在配置文件中。在開發(fā)過程中,通過重新編譯來調(diào)整日志配置不是問題,開發(fā)結(jié)束后,然而,你或許不想通過重新編譯來改變或者完全重新配置應(yīng)用中的日志。這時,Log4j提供了更多的彈性,尤其使用Tiger。
          ?
          Log4j提供了很多JUL缺少的功能,雖然JUL正在趕上。JUL可以完全擴(kuò)展后,來做Log4j做的事情 - 你可以寫更多的handlers,重新實(shí)現(xiàn)PatternLayout來為JUL,并且更新JUL配置機(jī)制,這些都不是很難。但是要在Log4j已存在這些特色數(shù)年時,為什么還做這些事呢?
          ?
          你要選擇哪一個庫呢?
          ?
          類似于這樣的重要決定經(jīng)常使得leaders失眠或者過早衰老。幸運(yùn)的是,這個決定可以通過檢測對于簡單的問題后,容易的做出。
          ?
          問題1
          你過早需要那些JUL沒有而Log4j有的handlers,例如SMTPHandler,NTEventLogHandler,或者其他任何非常便利的FileHandlers么?
          ?
          問題2
          你是否想頻繁的切換你日志輸出的格式?你是否需要簡單的方式這樣做?另外,你是否需要Log4j的PatternLayout?
          ?
          問題3
          你是否明確的需要在您的應(yīng)用中有這種能力,來改變復(fù)雜的日志配置在您的應(yīng)用中,即使他們已經(jīng)被編譯了并且部署到產(chǎn)品環(huán)境了?你的配置是不是聽起來像:“來自這個類的幾條信息通過郵件發(fā)送給技術(shù)支持工作者;類子集的幾條信息被記錄于我們服務(wù)器的syslog中;類子集的警告信息以一個文件記錄于網(wǎng)絡(luò)磁盤A中;并且各處所有信息以文件記錄于網(wǎng)絡(luò)磁盤B”?你是否沒過10幾天,就會改變一下?
          ?
          如果你對上面的問題都回答Yes,使用Log4j。如果你的回答全是明確的No,JUL足夠了,它已存在SDK中了。
          ?
          結(jié)論
          Log4j和JUL是非常相似的API。他們只在一些細(xì)節(jié)上不同,最后做的是同樣的事情,除了Log4j有了更多的特色,但也許你用不到。
          ?
          緊記,當(dāng)你移植到你選擇的日志庫,那么日志將影響應(yīng)用的性能。使得影響最小化的方法,就是盡量的重用loggers的引用;保存靜態(tài)或者引用指針到loggers,而不是每次你需要一個logger時,調(diào)用Logger.getLogger("loggerName")。log表達(dá)式放置于公有區(qū)域,而不是循環(huán)中。
          ?
          這篇文章不是深入研究如何使用Log4j或者JUL的教程,并且,實(shí)際上,演示了兩個庫很多的有用的特點(diǎn),例如MBeans支持(J2SE5.0,你能夠設(shè)置JUL記錄級別遠(yuǎn)程的通過JMX),和ResourceBundle支持。還有很多Log4j的高級特點(diǎn),例如filter鏈和Object-Renderers。因特網(wǎng)有很多如何使用他們的教程,JDJ中也有;在編碼之前,一定找到并學(xué)習(xí)他們。
          ?
          ?
          ?
          資源
          ?
        1. Log4j's home page: http://logging.apache.org/log4j
        2. JUL's home page: http://java.sun.com/j2se/1.4.2/docs/guide/util/logging
        3. Aggarwal, V."Third Party Logging API." Java Developer's Journal, Vol. 5, issue 11: http://sys-con.com/story/?storyid=36144
        4. Banes, J. "Building the Ultimate Logging Solution." Java Developer's Journal, Vol. 9, issue 5: http://sys-con.com/story/?storyid=44698
        5. Writing a sweet Log4j Appender that sends instant messages: www.106.ibm.com/developerworks/java/library/j-instlog/
        6. For those who don't like JUL or Log4j, try the Logging Toolkit for Java from IBM: www.alphaworks.ibm.com/tech/loggingtoolkit4j


        7. posted on 2005-10-27 12:37 北國狼人的BloG 閱讀(4311) 評論(1)  編輯  收藏 所屬分類: 翻譯Java文章

          評論:
          # re: Log4j 對比 java.util.logging 2007-08-21 15:03 | 波動拳
          說白了,就是小規(guī)模的應(yīng)用調(diào)試用JUL,要求比較高的,大規(guī)模的開發(fā)用Log4j麻  回復(fù)  更多評論
            

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 雅江县| 兴化市| 绿春县| 牟定县| 洛川县| 黄浦区| 沐川县| 新宾| 巴青县| 西昌市| 石城县| 垦利县| 齐齐哈尔市| 明水县| 忻州市| 普安县| 洮南市| 固原市| 济阳县| 古交市| 潜江市| 乌鲁木齐市| 广饶县| 仁布县| 海淀区| 章丘市| 乐昌市| 渝北区| 库车县| 房山区| 苗栗市| 青河县| 甘南县| 凌海市| 汕头市| 鹤峰县| 海门市| 侯马市| 清镇市| 安陆市| 明星|