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

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

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

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

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

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

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

    ⑴ 首先在classpath下尋找自己的配置文件commons-logging.properties,如果找到,則使用其中定義的Log實(shí)現(xiàn)類;這個(gè)屬性文件至少必須定義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。不過(guò)這時(shí)log4j本身的屬性仍要通過(guò)log4j.properties文件正確配置。
    通過(guò)jar的Service Provider Discovery機(jī)制查找 "META-INF/services/org.apache.commons.logging.Log"對(duì)應(yīng)的資源,Service Provider Discovery是JDK1.3之后出現(xiàn)的,我們熟知的XML解析器的查找過(guò)程就是利用這個(gè)機(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總是能找到一個(gè)日志實(shí)現(xiàn)類,并且盡可能找到一個(gè)“最合適”的日志實(shí)現(xiàn)類。我說(shuō)它“很貼心”實(shí)際上是因?yàn)椋?、可以不需要配置文件;2、自動(dòng)判斷有沒(méi)有Log4j包,有則自動(dòng)使用之;3、最悲觀的情況下也總能保證提供一個(gè)日志實(shí)現(xiàn)(SimpleLog)。
    可以看到,commons-logging對(duì)編程者和Log4j都非常友好。
    為了簡(jiǎn)化配置commons-logging,一般不使用commons-logging的配置文件,也不設(shè)置與commons-logging相關(guān)的系統(tǒng)環(huán)境變量,而只需將Log4j的Jar包放置到classpash中就可以了。這樣就很簡(jiǎn)單地完成了commons-logging與Log4j的融合。如果不想用Log4j了怎么辦?只需將classpath中的Log4j的Jar包刪除即可。
    就這么簡(jiǎn)單!

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

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

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

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

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

    輸出格式里%t指線程

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

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

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

    # 用于數(shù)據(jù)庫(kù)
    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)用于控制臺(tái)
    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


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲av成人无码网站…| 国产男女猛烈无遮挡免费视频网站| 综合一区自拍亚洲综合图区| 久久精品国产亚洲AV高清热 | 亚洲经典在线观看| 亚洲无码黄色网址| 免费高清在线影片一区| 99久久精品日本一区二区免费| 人妻免费一区二区三区最新| 又黄又大的激情视频在线观看免费视频社区在线| 亚洲高清视频免费| 久久久久久亚洲精品| 亚洲欭美日韩颜射在线二| 免费成人在线观看| 国产精品公开免费视频| 毛片免费在线视频| 免费一本色道久久一区| 国产成人精品免费视频大全麻豆| 日本高清高色视频免费| 少妇性饥渴无码A区免费 | 精品国产污污免费网站aⅴ| 九九美女网站免费| a视频在线观看免费| 久久精品免费网站网| 一个人免费观看www视频| 男女男精品网站免费观看| 国产成人亚洲精品蜜芽影院| 日韩精品内射视频免费观看| 成人片黄网站色大片免费观看cn| 人成免费在线视频| eeuss草民免费| sss日本免费完整版在线观看| 特级做a爰片毛片免费看| 一边摸一边爽一边叫床免费视频| 羞羞视频免费观看| jizz在线免费播放| 成人无码WWW免费视频| 日本免费人成网ww555在线| 99re6在线视频精品免费下载 | 亚洲人成在线播放网站| 亚洲精品无码不卡在线播HE|