隨筆-314  評(píng)論-209  文章-0  trackbacks-0

          摘要:

          本文描述了apache commons中的commons loggings部分,Commons Logging和Log4J用來(lái)提供日志支持。
          介紹
          命令行參數(shù)解析、應(yīng)用程序配置和日志記錄,作為一個(gè)應(yīng)用程序的骨架,隨處可見(jiàn)。因此,Apache軟件組織開(kāi)發(fā)出了一套通用的類(lèi)庫(kù),用來(lái)幫助軟件開(kāi)發(fā)人員完成這些“骨架”的建立。其中:
          •Commons CLI用于命令行解析
          •Commons Configuration用于讀取properties格式或者XML格式的配置信息
          •Commons Logging和Log4J用來(lái)提供日志支持。
          這些通用的類(lèi)庫(kù)都在http://jakarta.apache.org/commons/index.html網(wǎng)址上提供下載

          Apache組織開(kāi)發(fā)了一套用于支持Logging的Log4J,Java 1.4版本也引入了一套內(nèi)置的Logging框架,如果開(kāi)發(fā)者想在這兩套Logging系統(tǒng)之間自由的切換,該怎么辦呢?答案就是,使用Commons Logging。Commons Logging定義了一套抽象的Logging接口,用戶(hù)可以通過(guò)配置,使這些接口指向任何一個(gè)已存在的Logging系統(tǒng)。

          •使用抽象Logging接口
          問(wèn)題:
          你在編寫(xiě)一個(gè)可以重復(fù)使用的庫(kù),需要寫(xiě)入Log信息,但你不想使你的Logging功能綁定在Apache Log4J或者JDK 1.4 Logging框架上。
          解決方案:

          public static void main(String[] args) {//自己替換[]

          ??System.setProperty("org.apache.commons.logging.Log",
          ??????"org.apache.commons.logging.impl.Jdk14Logger");
          ??Log log = LogFactory.getLog("com.discursive.jccook.SomeApp");

          ??if (log.isTraceEnabled()) {
          ????log.trace("This is a trace message");
          ??}

          ??if (log.isDebugEnabled()) {
          ????log.debug("This is a debug message");
          ??}

          ??log.info("This is an informational message");
          ??log.warn("This is a warning");
          ??log.error("This is an error");
          ??log.fatal("This is fatal");

          }

          LogFactory.getLog方法會(huì)根據(jù)底層環(huán)境返回一個(gè)適當(dāng)?shù)腖og實(shí)現(xiàn)。如果用戶(hù)想指定一個(gè)具體的Logging系統(tǒng)實(shí)現(xiàn),可以設(shè)置org.apache.commons.logging.Log系統(tǒng)屬性。例如:
          System.setProperty("org.apache.commons.logging.Log",
          "org.apache.commons.logging.impl.Log4JLogger");
          這樣就會(huì)使用Log4J作為L(zhǎng)ogging系統(tǒng)。
          org.apache.commons.logging.Log可以設(shè)定為:
          •org.apache.commons.logging.impl.Log4JLogger??使用Log4J
          •org.apache.commons.logging.impl.Jdk14Logger??使用JDK 1.4 Logging框架
          •org.apache.commons.logging.impl.SimpleLog??使用Commons Logging內(nèi)置的簡(jiǎn)單Log實(shí)現(xiàn)
          其他:
          總結(jié)一下,Commons Logging會(huì)按照下列順序來(lái)指定具體的Log實(shí)現(xiàn)。
          •如果定義了org.apache.commons.logging.Log系統(tǒng)參數(shù),實(shí)用指定的Logging實(shí)現(xiàn)。
          •如果在CLASSPATH里發(fā)現(xiàn)了Log4J,使用Log4J。
          •如果使用的是JDK1.4,使用JDK1.4內(nèi)置的Logging框架。
          •如果都沒(méi)有找到,則使用Commons Logging內(nèi)置的簡(jiǎn)單Log實(shí)現(xiàn)。


          Jakarta Commons Logging學(xué)習(xí)筆記 轉(zhuǎn)載

          1、Commons-Loggin簡(jiǎn)介

            Jakarta Commons Logging (JCL)提供的是一個(gè)日志(Log)接口(interface),同時(shí)兼顧輕量級(jí)和不依賴(lài)于具體的日志實(shí)現(xiàn)工具。 它提供給中間件/日志工具開(kāi)發(fā)者一個(gè)簡(jiǎn)單的日志操作抽象,允許程序開(kāi)發(fā)人員使用不同的具體日志實(shí)現(xiàn)工具。用戶(hù)被假定已熟悉某種日志實(shí)現(xiàn)工具的更高級(jí)別的細(xì)節(jié)。JCL提供的接口,對(duì)其它一些日志工具,包括Log4J, Avalon LogKit, and JDK 1.4等,進(jìn)行了簡(jiǎn)單的包裝,此接口更接近于Log4J和LogKit的實(shí)現(xiàn).

          2、快速入門(mén)

            JCL有兩個(gè)基本的抽象類(lèi):Log(基本記錄器)和LogFactory(負(fù)責(zé)創(chuàng)建Log實(shí)例)。當(dāng)commons-logging.jar被加入到CLASSPATH之后,它會(huì)心可能合理地猜測(cè)你喜歡的日志工具,然后進(jìn)行自我設(shè)置,用戶(hù)根本不需要做任何設(shè)置。默認(rèn)的LogFactory是按照下列的步驟去發(fā)現(xiàn)并決定那個(gè)日志工具將被使用的(按照順序,尋找過(guò)程會(huì)在找到第一個(gè)工具時(shí)中止):

          尋找當(dāng)前factory中名叫org.apache.commons.logging.Log配置屬性的值

          尋找系統(tǒng)中屬性中名叫org.apache.commons.logging.Log的值

          如果應(yīng)用程序的classpath中有l(wèi)og4j,則使用相關(guān)的包裝(wrapper)類(lèi)(Log4JLogger)

          如果應(yīng)用程序運(yùn)行在jdk1.4的系統(tǒng)中,使用相關(guān)的包裝類(lèi)(Jdk14Logger)

          使用簡(jiǎn)易日志包裝類(lèi)(SimpleLog)


          3、開(kāi)發(fā)使用logging


          //在程序文件頭部import相關(guān)的類(lèi)
          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;
          ......
          //在類(lèi)中獲取一個(gè)實(shí)例
          public class MYCLASS
          {
          private static Log log = LogFactory.getLog(MyCLASS.class);
          ...
           }

          日志信息被送往記錄器,如上例中的log。這個(gè)發(fā)送過(guò)程,是通過(guò)調(diào)用Log接口中定義的方法完成的,不同方法跟不同的級(jí)別聯(lián)系在一起,日志信息通過(guò)哪個(gè)級(jí)別的方法發(fā)送,就標(biāo)明了日志信息的級(jí)別。org.apache.commons.logging.Log接口中定義的方法,按嚴(yán)重性由高到低的順序有:


          log.fatal(Object message);

          log.fatal(Object message, Throwable t);

          log.error(Object message);

          log.error(Object message, Throwable t);

          log.warn(Object message);

          log.warn(Object message, Throwable t);

          log.info(Object message);

          log.info(Object message, Throwable t);

          log.debug(Object message);

          log.debug(Object message, Throwable t);

          log.trace(Object message);

          log.trace(Object message, Throwable t);
          除此以外,還提供下列方法以便代碼保護(hù).

          log.isFatalEnabled();

          log.isErrorEnabled();

          log.isWarnEnabled();

          log.isInfoEnabled();

          log.isDebugEnabled();

          log.isTraceEnabled();

            信息級(jí)別
            確保日志信息在內(nèi)容上和反應(yīng)問(wèn)題的嚴(yán)重程度上的恰當(dāng),是非常重要的。

          fatal非常嚴(yán)重的錯(cuò)誤,導(dǎo)致系統(tǒng)中止。期望這類(lèi)信息能立即顯示在狀態(tài)控制臺(tái)上。

          error其它運(yùn)行期錯(cuò)誤或不是預(yù)期的條件。期望這類(lèi)信息能立即顯示在狀態(tài)控制臺(tái)上。

          warn使用了不贊成使用的API、非常拙劣使用API, '幾乎就是'錯(cuò)誤, 其它運(yùn)行時(shí)不合需要和不合預(yù)期的狀態(tài)但還沒(méi)必要稱(chēng)為 "錯(cuò)誤"。期望這類(lèi)信息能立即顯示在狀態(tài)控制臺(tái)上。

          info運(yùn)行時(shí)產(chǎn)生的有意義的事件。期望這類(lèi)信息能立即顯示在狀態(tài)控制臺(tái)上。

          debug系統(tǒng)流程中的細(xì)節(jié)信息。期望這類(lèi)信息僅被寫(xiě)入log文件中。

          trace更加細(xì)節(jié)的信息。期望這類(lèi)信息僅被寫(xiě)入log文件中。

          通常情況下,記錄器的級(jí)別不應(yīng)低于info.也就是說(shuō),通常情況下debug的信息不應(yīng)被寫(xiě)入log文件中。
            工作機(jī)理

          生命周期
          JCL LogFactory必須實(shí)現(xiàn)建立/斷開(kāi)到日志工具的連接,實(shí)例化/初始化/解構(gòu)一個(gè)日志工具.

          異常處理
          JCL Log 接口沒(méi)有指定任何異常處理,對(duì)接口的實(shí)現(xiàn)必須捕獲并處理異常。


          多線(xiàn)程
          JCL Log 和 LogFactory 的實(shí)現(xiàn),必須確保任何日志工具對(duì)并行的要求.


            記錄器的設(shè)置
            JCL采用的記錄器的不同其設(shè)置內(nèi)容也不同。Log4J是默認(rèn)首選記錄器,對(duì)其設(shè)置可通過(guò)系統(tǒng)屬性(system properties)或一個(gè)屬性文件進(jìn)行設(shè)置,下面是其設(shè)置參數(shù)。
          <table border="1"><tr><td>參數(shù)</td><td>值域</td><td>默認(rèn)值</td><td>說(shuō)明</td></tr><tr><td>log4j.configuration</td><td></td><td>log4j.properties</td><td>指定配置文件的名字</td></tr><tr><td>log4j.rootCategory</td><td>priority [, appender]*</td><td></td><td>設(shè)定根記錄器的級(jí)別</td></tr><tr><td>log4j.logger&lt;.logger.name&gt;</td><td>DEBUG, INFO, WARN, ERROR, or FATAL</td><td>設(shè)定logger.name這個(gè)記錄器的級(jí)別</td></tr><tr><td>log4j.appender&lt;.appender&gt;.Threshold</td><td>priority</td><td>指定記錄設(shè)備appender(console, files, sockets, and others)的最低級(jí)別。</td></tr></table><br />
          posted on 2006-09-04 00:48 xzc 閱讀(923) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Log4j
          主站蜘蛛池模板: 郸城县| 綦江县| 子洲县| 广河县| 沙雅县| 新干县| 壤塘县| 灵台县| 南和县| 顺义区| 许昌县| 顺平县| 晋中市| 南汇区| 灌云县| 宁蒗| 龙江县| 永安市| 鸡西市| 阿瓦提县| 南华县| 浠水县| 陵川县| 萨嘎县| 荣昌县| 河北省| 巴南区| 郎溪县| 家居| 封开县| 台南市| 凤冈县| 和硕县| 南澳县| 井陉县| 邯郸市| 丽江市| 策勒县| 道真| 台湾省| 黄大仙区|