日志管理(一):slf4j原理简单介绍
轉(zhuǎn)載自:http://blog.sina.com.cn/s/blog_6f67b91d0100tpqh.html
?
全稱:Simple Logging Facade for Java? 簡單日志門面(Facade)SLF4J是為各種loging APIs提供一個(gè)簡單統(tǒng)一的接口,從而使得最終用戶能夠在部署的時(shí)候配置自己希望的loging APIs實(shí)現(xiàn)。
?????? Logging API實(shí)現(xiàn)既可以選擇直接實(shí)現(xiàn)SLF4J接口的loging APIs如:logback、SimpleLogger。也可以通過開發(fā)相應(yīng)的適配器來使用已有的API實(shí)現(xiàn)如Log4jLoggerAdapter、JDK14LoggerAdapter。
????? SLF4J 不依賴任何特殊的class loader機(jī)制,實(shí)際上,SLF4J 和已有日志實(shí)現(xiàn)的綁定是在編譯時(shí)靜態(tài)執(zhí)行的,具體綁定工作是通過一個(gè)jar包實(shí)現(xiàn)的,使用時(shí)只要把相應(yīng)的jar包(只有一個(gè))放到類路徑上即可。
???? 在 SLF4J發(fā)行版本中包含了幾個(gè)jar包,如slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-log4j13.jar, slf4j-jdk14.jar and slf4j-jcl.jar,Each of these jar files is hardwired at compile-time to use just one implementation, that is NOP, Simple, log4j version 1.2, log4j version 1.3, JDK 1.4 logging, and repectively JCL等.
????SLF4J支持多個(gè)日志系統(tǒng),比如NOP, Simple, log4j version 1.2, log4j version 1.3, JDK 1.4 logging, JCL and logback。
?
???? 其實(shí)slf4j原理很簡單,他只提供一個(gè)核心slf4j api(就是slf4j-api.jar包),這個(gè)包只有日志的接口,并沒有實(shí)現(xiàn),所以如果要使用就得再給它提供一個(gè)實(shí)現(xiàn)了些接口的日志包,比如:log4j,common logging,jdk log日志實(shí)現(xiàn)包等,但是這些日志實(shí)現(xiàn)又不能通過接口直接調(diào)用,實(shí)現(xiàn)上他們根本就和slf4j-api不一致,因此slf4j又增加了一層來轉(zhuǎn)換各日志實(shí)現(xiàn)包的使用,當(dāng)然slf4j-simple除外。其結(jié)構(gòu)如下:
????????? ?slf4j-api(接口層)
?????????? ??? ?|
???? 各日志實(shí)現(xiàn)包的連接層( slf4j-jdk14, slf4j-log4j)
?????????????? |
?????? 各日志實(shí)現(xiàn)包
????? 下面這個(gè)圖更能說明其原理:
在這里還需要注意的是,連接層的jar包和實(shí)現(xiàn)的jar的版本要一致。
附j(luò)ar說明:
slf4j-api-1.6.1.jar????? ?? -->? slf4j核心接口包
slf4j-simple-1.6.1.jar????? -->? slf4j Simple Logger日志實(shí)現(xiàn)包
slf4j-nop-1.6.1.jar???????? -->
slf4j-migrator-1.6.1.jar??? -->
slf4j-log4j12-1.6.1.jar???? -->? slf4j調(diào)用log4j的實(shí)現(xiàn)包
slf4j-jdk14-1.6.1.jar?????? -->? slf4j調(diào)用jdk java.util.logging的實(shí)現(xiàn)包
slf4j-jcl-1.6.1.jar???????? -->? Jakarta Commons Logging
slf4j-ext-1.6.1.jar???????? -->
log4j-over-slf4j-1.6.1.jar? -->
jul-to-slf4j-1.6.1.jar??? ? -->
jcl-over-slf4j-1.6.1.jar??? -->
slf4j+log4j組合使用模式:
1. slf4j-api-1.5.11.jar
2. slf4j-log4j12-1.5.11.jar
3. log4j-1.2.15.jar
4. log4j.properties(也可以是 log4j.xml,本例中用 log4j.propertes)
JCL+Log4J組合使用模式:
1. commons-logging-1.1.jar
2. log4j-1.2.15.jar
3. log4j.properties
把這種 SLF4J+Log4J 的使用模式與曾為霸主地位的 JCL+Log4J 的用法進(jìn)行一下對比(請忽略掉包文件中的版本號):
| SLF4J+Log4j 組合 | 對比 | JCL+Log4J 組合 |
| slf4j-api-1.5.11.jar | 相當(dāng),定義高層 API | commons-logging-1.1.jar |
| slf4j-log4j12-1.5.11.jar | 相當(dāng),左邊是用綁定包,右邊 是用配置文件來指定日志實(shí)現(xiàn) | commons-logging.properties,內(nèi)容為: org.apache.commons.logging.LogFactory= org.apache.commons.logging.impl.LogFactoryImpl 或者 org.apache.commons.logging.Log= org.apache.commons.logging.impl.Log4JLogger |
| log4j-1.2.15.jar | 一樣 | log4j-1.2.15.jar |
| log4j.properties | 一樣,原來怎么配置現(xiàn)在也是 | log4j.properties |
| 程序代碼中: import org.slf4j.Logger; import org.slf4j.LoggerFactory; Logger logger = LoggerFactory.getLogger(TestSlf4j.class); logger.info("Hello {}","SLF4J"); | 左邊侵入的是 SLF4J API,右邊是被 JCL 的 API 污染了 SLF4J 支持參數(shù)化,而 JCL 不能 | 程序代碼中: import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; Log log = LogFactory.getLog(TestJCL.class); log.info("Hello JCL"); |
從上面的對比來看,SLF4j+Log4j 與 JCL+Log4J 的使用方式差不多,主要差異就在 SLF4J?用 jar 來告知用哪種日志實(shí)現(xiàn),而 JCL 是通過配置文件來獲得該選擇哪個(gè)日志實(shí)現(xiàn)。
為 什么會(huì)興起 SLF4J,看看我們原來哪一個(gè)框架中,大的如 SSH 三雄(Spring、Struts、Hibernate),還有 WAS 應(yīng)用服務(wù)器,小的就不計(jì)其數(shù)以前用的通用日志框架都清一色的 Jakarta Commons Logging(JCL),日志實(shí)現(xiàn)會(huì)選用 Log4j,為何現(xiàn)在 Hibernate、Tapesty、DbUnit、Jetty V6 等紛紛變節(jié),都采用了 SLF4J 了呢?SLF4J 與 JCL 相比,定然是有其可表之處。而其中 SLF4J 受類加載器的影響較小,不易產(chǎn)生內(nèi)存溢出的問題,性能得到了改善,更主要是順應(yīng)了潮流的發(fā)展--可方便部署到 OSGI 環(huán)境中。
如何使用slf4j
下邊一段程序是經(jīng)典的使用slf4j的方法.
?下邊介紹一下運(yùn)行上邊程序的過程。
1,編譯上邊的程序,需要classpath中加入slf4j-api-1.4.1.jar文件
2,運(yùn)行時(shí),需要classpath中加上slf4j-simple-1.4.1.jar
運(yùn)行得到結(jié)果:
----------------------------
0 [main] ERROR Wombat - Temperature set to 1. Old temperature was null.
0 [main] ERROR Wombat - Temperature set to 55. Old temperature was 1.
0 [main] INFO Wombat - Temperature has risen above 50 degrees.
這個(gè)是simple log風(fēng)格,
3,切換:如果想切換到j(luò)dk14的log的風(fēng)格,只需要把slf4j-simple-1.4.1.jar
從classpath中移除,同時(shí)classpath中加入slj4j-jdk14-1.4.1.jar
這時(shí)的運(yùn)行結(jié)果:
---------------------------------------------------
2007-7-9 10:40:15 Wombat setTemperature
嚴(yán)重: Temperature set to 1. Old temperature was null.
2007-7-9 10:40:16 Wombat setTemperature
嚴(yán)重: Temperature set to 55. Old temperature was 1.
2007-7-9 10:40:16 Wombat setTemperature
信息: Temperature has risen above 50 degrees.
已經(jīng)變成jdk14的log風(fēng)格了。
4,再次切換到log4j
同樣移除slj4j-jdk14-1.4.1.jar,加入slf4j-log4j12-1.4.1.jar,同時(shí)加入log4j-1.2.x.jar
加入log4j.properties。得到顯示結(jié)果:
---------------------------------------
10:42:27,328 ERROR Wombat: Temperature set to 1. Old temperature was null.
10:42:27,328 ERROR Wombat: Temperature set to 55. Old temperature was 1.
10:42:27,328? INFO Wombat: Temperature has risen above 50 degrees.
在不同的風(fēng)格中切換只需要在部署期切換類庫就可以了,和開發(fā)時(shí)無關(guān)。
總結(jié)
以上是生活随笔為你收集整理的日志管理(一):slf4j原理简单介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: concurrent: wai noti
- 下一篇: jackson json 转换Bean,