Apache組織開發了一套用于支持Logging的Log4J,Java?1.4版本也引入了一套內置的 Logging框架,如果開發者想在這兩套Logging系統之間自由的切換,該怎么辦呢?答案就是,使用Commons?Logging。 Commons?Logging定義了一套抽象的Logging接口,用戶可以通過配置,使這些接口指向任何一個已存在的Logging系統。
⑴ 首先在classpath下尋找自己的配置文件commons-logging.properties,如果找到,則使用其中定義的Log實現類;這個屬性文件至少必須定義org.apache.commons.logging.Log屬性,它的值應該是上述任意Log接口實現的完整限定名稱。
⑵ 如果上面的步驟失敗,Commons的Logging接著檢查系統屬性org.apache.commons.logging.Log。
?? System.setProperty("org.apache.commons.logging.Log","org.apache.commons.logging.impl.Log4JLogger");
⑶ 如果找不到org.apache.commons.logging.Log系統屬性,Logging接著在CLASSPATH中尋找log4j的類。如果找到了,Logging就假定應用要使用的是log4j。不過這時log4j本身的屬性仍要通過log4j.properties文件正確配置。
通過jar的Service Provider Discovery機制查找 "META-INF/services/org.apache.commons.logging.Log"對應的資源,Service Provider Discovery是JDK1.3之后出現的,我們熟知的XML解析器的查找過程就是利用這個機制.
⑷ 如果上述查找均不能找到適當的Logging API,但應用程序正運行在JRE 1.4或更高版本上,則默認使用JRE 1.4的日志記錄功能。
⑸ 最后,如果上述操作都失敗,則應用將使用內建的SimpleLog。SimpleLog把所有日志信息直接輸出到System.err。
可見,commons-logging總是能找到一個日志實現類,并且盡可能找到一個“最合適”的日志實現類。我說它“很貼心”實際上是因為:1、可以不需要配置文件;2、自動判斷有沒有Log4j包,有則自動使用之;3、最悲觀的情況下也總能保證提供一個日志實現(SimpleLog)。
可以看到,commons-logging對編程者和Log4j都非常友好。
為了簡化配置commons-logging,一般不使用commons-logging的配置文件,也不設置與commons-logging相關的系統環境變量,而只需將Log4j的Jar包放置到classpash中就可以了。這樣就很簡單地完成了commons-logging與Log4j的融合。如果不想用Log4j了怎么辦?只需將classpath中的Log4j的Jar包刪除即可。
就這么簡單!
Commons logging的關鍵點:
??? * 提供一個日志記錄功能的抽象
??? * 提供一種從該抽象到具體日志記錄實現的映射
??? * 提供默認的映射和發現機制,提高自身的易用性
看花的人多,懂花的少哦。------俺們力爭去做懂花人。等老了,一邊夕陽西下,一邊品茶賞花,豈不樂哉。
日志的級別從高到低依次為:fatal,error,warn,info,debug,trace.
自己只適用三種就夠了,調試用debug,運行時有意義的信息用info,錯誤用error
log4j.rootLogger是最最重要的一個屬性了,它定義日志信息的“輸出級別”和“輸出目的地”。
設置分兩部分,第一個逗號之前的是第一部分,指定“輸出級別”;后面的是第二部分,指定“輸出目的地”??梢酝瑫r指定多個“輸出目的地”,以逗號隔開。
不同的appender,打印的基本可以單獨設置,例如log4j.appender.logfile.Threshold =debug
輸出格式里%t指線程
“同時使用commons-logging和Log4j”的原因是,簡化使用和配置。
強調一點,“同時使用commons-logging和Log4j”,與“單獨使用Log4j”相比,并不會帶來更大的學習、配置和維護成本,反而更加簡化了我們的工作。我想這也是為什么“所有用到Log4j的項目一般也同時會用到commons-loggin”的原因之一吧。
Commons-logging能幫我們做什么?
提供一個統一的日志接口,簡單了操作,同時避免項目與某個日志實現系統緊密a耦合
很貼心的幫我們自動選擇適當的日志實現系統(這一點非常好?。┧踔敛恍枰渲?/p>
private static Log log = LogFactory.getLog(YouClassName.class);
注意這里定義的是static成員,以避免產生多個實例。
LogFactory.getLog()方法的參數使用的是當前類的class,這是目前被普通認為的最好的方式。為什么不寫作LogFactory.getLog(this.getClass())?因為static類成員訪問不到this指針!
將commons-logging和Log4j的jar包都放置到classpath下,同時也將Log4j的配置文件放到classpath中,兩者就可以很好的合作。
采用Log4j配合commons-logging作為日志系統,是目前Java領域非常非常流行的模式,使用非常非常的普遍。兩者的結合帶來的結果就是:簡單 + 強大。
commons-logging提供了簡捷、統一的接口,不需要額外配置,簡單;
Log4j功能非常全面、強大;
commons-logging僅僅對Log4j(當然還包括其它LOG實現)作了一層包裝,具體的日志輸出還是在內部轉交給身后的Log4j來處理;而Log4j雖然做了所有的事情,卻甘作綠葉,從不以真身示人。
兩者堪稱絕配。
# 用于數據庫
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
# 發送日志給郵件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
# 應用于控制臺
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
#應用于文件
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
# 應用于文件回滾
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
#應用于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