爲了讓系統的log實現變成可配置,java的大牛們實現了兩種底層接口規範,1.commons-logging 2.slf4jjava
1、commons-logging這是一個Apache項目,歷史悠久,基於classloader的。包括spring都在使用這個log底層接口規範spring
實現原理:我定義1個LogFactory,這個LogFactory能夠生產Logapache
至於使用哪一個LogFactory就要根據系統不一樣的配置參數,因此他就可以生產出不一樣廠家的Logapi
好比說:框架
commongs-logging在建立LogFactory的時候有這麼個順序,jvm
a.首先去判斷jvm配置參數中是否有設置性能
b.而後在去檢測 META-INF/services/org.apache.commons.logging.LogFactory文件日誌
c.實在找不到就去找用戶 commons-logging.properties 裏面的配置code
d.最後是在都沒找到的話,那就使用本身的默認實現LogFactoryImpl(LogFactoryImpl這個默認實現比較有意思,他默承認以生產Log4JLogger、Jdk14Logger、Jdk13LumberjackLogger、SimpleLog)blog
結論:若是使用commons-logging,必須須要配置一個真正的實現log*.jar幹活
2、 slf4j全稱爲Simple Logging Facade for JAVA,java簡單日誌門面 , 相似於Apache Common-Logging,是對不一樣日誌框架提供的一個門面封裝,能夠在部署的時候不修改任何配置便可接入一種日誌實現方案。可是,他在編譯時靜態綁定真正的Log庫。使用SLF4J時,若是你須要使用某一種日誌實現,那麼你必須選擇正確的SLF4J的jar包的集合(各類橋接包)。 slf4j是一個日誌系統的封裝,對外提供統一的API,不提供日誌具體實現
1.slf4j基本包 slf4J-api.jar
2.slf4j橋接具體log實現的包:
log4j:slf4j-log4j12.jar
logback:logback-core、logback- classic
3.也能夠把slf4j做爲commongs-logging的一種實現,須要引入jcl-over-slf4j.jar(這個裏面主要關注是在META-INF/services/org.apache.commons.logging.LogFactory文件中配置了LogFactory實現類:org.apache.commons.logging.impl.SLF4JLogFactory)
3、總結
1.目前市面上真正在用的也就是log4j和logback。都是一我的寫的,聽說logback比log4j性能要好不少,下面看看具體說法
LogBack做爲一個通用可靠、快速靈活的日誌框架,將做爲Log4j的替代和SLF4J組成新的日誌系統的完整實現。LogBack聲稱具備極佳的性能,「 某些關鍵操做,好比斷定是否記錄一條日誌語句的操做,其性能獲得了顯著的提升。這個操做在LogBack中須要3納秒,而在Log4J中則須要30納秒。 LogBack建立記錄器(logger)的速度也更快:13微秒,而在Log4J中須要23微秒。更重要的是,它獲取已存在的記錄器只需94納秒,而 Log4J須要2234納秒,時間減小到了1/23。跟JUL相比的性能提升也是顯著的」。 另外,LOGBack的全部文檔是全面免費提供的,不象Log4J那樣只提供部分免費文檔而須要用戶去購買付費文檔。
2.看看SLF4j和具體實現的關係:
3. 用別的日誌接口,轉成slf4j的方法
一、commons-loggin,slf4j只是一種日誌抽象門面,不是具體的日誌框架。
二、log4j,logback是具體的日誌框架。
三、通常首選使用slf4j+logback,或者slf4j+log4j,commons-logging+log4j。