MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          commons logging筆記(轉(zhuǎn))

          Posted on 2008-04-05 23:04 leekiang 閱讀(1514) 評論(0)  編輯  收藏 所屬分類: commons

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

          ⑴ 首先在classpath下尋找自己的配置文件commons-logging.properties,如果找到,則使用其中定義的Log實(shí)現(xiàn)類;這個屬性文件至少必須定義org.apache.commons.logging.Log屬性,它的值應(yīng)該是上述任意Log接口實(shí)現(xiàn)的完整限定名稱。
          ⑵ 如果上面的步驟失敗,Commons的Logging接著檢查系統(tǒng)屬性org.apache.commons.logging.Log。
          ?? System.setProperty("org.apache.commons.logging.Log","org.apache.commons.logging.impl.Log4JLogger");
          ⑶ 如果找不到org.apache.commons.logging.Log系統(tǒng)屬性,Logging接著在CLASSPATH中尋找log4j的類。如果找到了,Logging就假定應(yīng)用要使用的是log4j。不過這時log4j本身的屬性仍要通過log4j.properties文件正確配置。
          通過jar的Service Provider Discovery機(jī)制查找 "META-INF/services/org.apache.commons.logging.Log"對應(yīng)的資源,Service Provider Discovery是JDK1.3之后出現(xiàn)的,我們熟知的XML解析器的查找過程就是利用這個機(jī)制.
          ⑷ 如果上述查找均不能找到適當(dāng)?shù)腖ogging API,但應(yīng)用程序正運(yùn)行在JRE 1.4或更高版本上,則默認(rèn)使用JRE 1.4的日志記錄功能。
          ⑸ 最后,如果上述操作都失敗,則應(yīng)用將使用內(nèi)建的SimpleLog。SimpleLog把所有日志信息直接輸出到System.err。

          可見,commons-logging總是能找到一個日志實(shí)現(xiàn)類,并且盡可能找到一個“最合適”的日志實(shí)現(xiàn)類。我說它“很貼心”實(shí)際上是因為:1、可以不需要配置文件;2、自動判斷有沒有Log4j包,有則自動使用之;3、最悲觀的情況下也總能保證提供一個日志實(shí)現(xiàn)(SimpleLog)。
          可以看到,commons-logging對編程者和Log4j都非常友好。
          為了簡化配置commons-logging,一般不使用commons-logging的配置文件,也不設(shè)置與commons-logging相關(guān)的系統(tǒng)環(huán)境變量,而只需將Log4j的Jar包放置到classpash中就可以了。這樣就很簡單地完成了commons-logging與Log4j的融合。如果不想用Log4j了怎么辦?只需將classpath中的Log4j的Jar包刪除即可。
          就這么簡單!

          Commons logging的關(guān)鍵點(diǎn):

          ??? * 提供一個日志記錄功能的抽象
          ??? * 提供一種從該抽象到具體日志記錄實(shí)現(xiàn)的映射
          ??? * 提供默認(rèn)的映射和發(fā)現(xiàn)機(jī)制,提高自身的易用性
          看花的人多,懂花的少哦。------俺們力爭去做懂花人。等老了,一邊夕陽西下,一邊品茶賞花,豈不樂哉。

          日志的級別從高到低依次為:fatal,error,warn,info,debug,trace.
          自己只適用三種就夠了,調(diào)試用debug,運(yùn)行時有意義的信息用info,錯誤用error

          log4j.rootLogger是最最重要的一個屬性了,它定義日志信息的“輸出級別”和“輸出目的地”。
          設(shè)置分兩部分,第一個逗號之前的是第一部分,指定“輸出級別”;后面的是第二部分,指定“輸出目的地”。可以同時指定多個“輸出目的地”,以逗號隔開。

          不同的appender,打印的基本可以單獨(dú)設(shè)置,例如log4j.appender.logfile.Threshold =debug

          輸出格式里%t指線程

          “同時使用commons-logging和Log4j”的原因是,簡化使用和配置。
          強(qiáng)調(diào)一點(diǎn),“同時使用commons-logging和Log4j”,與“單獨(dú)使用Log4j”相比,并不會帶來更大的學(xué)習(xí)、配置和維護(hù)成本,反而更加簡化了我們的工作。我想這也是為什么“所有用到Log4j的項目一般也同時會用到commons-loggin”的原因之一吧。
          Commons-logging能幫我們做什么?
          提供一個統(tǒng)一的日志接口,簡單了操作,同時避免項目與某個日志實(shí)現(xiàn)系統(tǒng)緊密a耦合
          很貼心的幫我們自動選擇適當(dāng)?shù)娜罩緦?shí)現(xiàn)系統(tǒng)(這一點(diǎn)非常好!)它甚至不需要配置

          private static Log log = LogFactory.getLog(YouClassName.class);
          注意這里定義的是static成員,以避免產(chǎn)生多個實(shí)例。
          LogFactory.getLog()方法的參數(shù)使用的是當(dāng)前類的class,這是目前被普通認(rèn)為的最好的方式。為什么不寫作LogFactory.getLog(this.getClass())?因為static類成員訪問不到this指針!
          將commons-logging和Log4j的jar包都放置到classpath下,同時也將Log4j的配置文件放到classpath中,兩者就可以很好的合作。

          采用Log4j配合commons-logging作為日志系統(tǒng),是目前Java領(lǐng)域非常非常流行的模式,使用非常非常的普遍。兩者的結(jié)合帶來的結(jié)果就是:簡單 + 強(qiáng)大。
          commons-logging提供了簡捷、統(tǒng)一的接口,不需要額外配置,簡單;
          Log4j功能非常全面、強(qiáng)大;
          commons-logging僅僅對Log4j(當(dāng)然還包括其它LOG實(shí)現(xiàn))作了一層包裝,具體的日志輸出還是在內(nèi)部轉(zhuǎn)交給身后的Log4j來處理;而Log4j雖然做了所有的事情,卻甘作綠葉,從不以真身示人。
          兩者堪稱絕配。

          # 用于數(shù)據(jù)庫
          log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
          log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
          log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
          log4j.appender.DATABASE.user=root
          log4j.appender.DATABASE.password=123
          log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
          log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
          log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

          # 發(fā)送日志給郵件log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
          log4j.appender.MAIL.Threshold=FATAL
          log4j.appender.MAIL.BufferSize=10
          log4j.appender.MAIL.From=web@www.wuset.com
          log4j.appender.MAIL.SMTPHost=www.wusetu.com
          log4j.appender.MAIL.Subject=Log4J Message
          log4j.appender.MAIL.To=web@www.wusetu.com
          log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
          log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

          # 應(yīng)用于控制臺
          log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
          log4j.appender.Threshold=DEBUG
          log4j.appender.CONSOLE.Target=System.out
          log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
          log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
          #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread] n%c[CATEGORY]%n%m[MESSAGE]%n%n

          #應(yīng)用于文件
          log4j.appender.FILE=org.apache.log4j.FileAppender
          log4j.appender.FILE.File=file.log
          log4j.appender.FILE.Append=false
          log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
          log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
          # Use this layout for LogFactor 5 analysis

          # 應(yīng)用于文件回滾
          log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
          log4j.appender.ROLLING_FILE.Threshold=ERROR
          log4j.appender.ROLLING_FILE.File=rolling.log
          log4j.appender.ROLLING_FILE.Append=true
          log4j.appender.ROLLING_FILE.MaxFileSize=10KB
          log4j.appender.ROLLING_FILE.MaxBackupIndex=1
          log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
          log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

          #應(yīng)用于socket
          log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
          log4j.appender.SOCKET.RemoteHost=localhost
          log4j.appender.SOCKET.Port=5001
          log4j.appender.SOCKET.LocationInfo=true
          # Set up for Log Facter 5
          log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
          log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread]%n%c[CATEGORY]%n%m[MESSAGE]%n%n

          # Log Factor 5 Appender
          log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
          log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000

          #自定義Appender
          log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
          log4j.appender.im.host = mail.cybercorlin.net
          log4j.appender.im.username = username
          log4j.appender.im.password = password
          log4j.appender.im.recipient = corlin@cybercorlin.net
          log4j.appender.im.layout=org.apache.log4j.PatternLayout
          log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 明溪县| 舟曲县| 双桥区| 大英县| 横峰县| 密山市| 江城| 鲁山县| 平顺县| 承德县| 湖州市| 扎鲁特旗| 东辽县| 磐安县| 丹阳市| 东宁县| 遂溪县| 资溪县| 原平市| 浪卡子县| 通海县| 通城县| 溧水县| 拉萨市| 仁化县| 交城县| 汉源县| 安福县| 永胜县| 长乐市| 皋兰县| 聊城市| 子洲县| 台州市| 潮安县| 从化市| 天峨县| 昌宁县| 连州市| 兴业县| 措美县|