<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    北國狼人 翻譯

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


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

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

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


    網站導航:
     
    主站蜘蛛池模板: 皇色在线视频免费网站| 一级毛片免费观看不卡视频| 免费国产黄线在线观看| 亚洲第一网站免费视频| 三年片在线观看免费大全电影 | 亚洲无av在线中文字幕| www免费黄色网| 亚洲AV无码一区二区二三区入口 | 亚洲国产精品线观看不卡| xx视频在线永久免费观看| 亚洲国产av一区二区三区丶| 中文字幕免费在线看线人| 国产成人精品亚洲日本在线| 大香人蕉免费视频75| 美女黄频视频大全免费的| 亚洲精品无码专区久久同性男| 国产精品免费久久久久久久久 | 亚洲伊人成无码综合网 | 亚洲综合区小说区激情区| 黄色一级毛片免费| 中文字幕精品无码亚洲字 | 国产A在亚洲线播放| 亚洲成A∨人片天堂网无码| 免费的黄网站男人的天堂| 亚洲精品一品区二品区三品区| 久久精品一区二区免费看| 亚洲av午夜精品无码专区| 国产小视频在线免费| 怡红院免费全部视频在线视频| 久久久久久久亚洲Av无码| 日韩毛片在线免费观看| 亚洲色欲一区二区三区在线观看| 久久青草免费91观看| 亚洲成a人片在线观看精品| 国产又粗又猛又爽又黄的免费视频| 一个人看的hd免费视频| 亚洲男人第一av网站| 国产成人无码a区在线观看视频免费 | 色屁屁www影院免费观看视频| 亚洲精品制服丝袜四区| 影音先锋在线免费观看|