SLF4J 的幾種實際應用模式--:SLF4J+Log4J 與 SLF4J+LogBack



SLF4J(Simple Logging Facade for Java) 是一個通用的日志框架,不能何以謂之 Facade(門面),所扮眼的角色相當於 Jakarta Commons Logging。就像 JCL 需要底層的日志實現,如 Log4J、java.util.logging、Simple Logger 等來完成具體的信息輸出,事實上基本總是 JCL+Log4J 那么一個絕配。SLF4J 的原旨也是能支持多種下層日志框架實現,但最好的日志實現仍然是 Log4J
,所以本篇講述 SLF4J 的第一種用法 SLF4J+Log4J
需要的配置文件和組件包,下面三個 jar 文件和一個 properties 文件都是要放在項目的 ClassPath 上。
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)
前兩個包在 http://www.slf4j.org/download.html 處下載,后一個包在 http://logging.apache.org/log4j/1.2/download.html 下載,可能包文件名中的版本號有些差,不要緊。
log4j.properties 以前該是怎么寫,現在還是怎么寫,比如一個最簡單的內容,只向控制台輸出日志信息,如下: 
1.log4j.rootLogger=DEBUG,console  

2.log4j.appender.console=org.apache.log4j.ConsoleAppender

3.log4j.appender.console.layout=org.apache.log4j.PatternLayout

4.log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
使用 SLF4J  的代碼: 
01.package com.unmi; 

02.

03.import org.slf4j.Logger;

04.import org.slf4j.LoggerFactory;

05.

06.public class TestSlf4j {

07. private static final Logger logger = LoggerFactory.getLogger(TestSlf4j.class);

08.

09. public static void main(String[] args) {

10. logger.info("Hello {}","SLF4J");

11. }

12.}

執行它,控制台輸出:
2010-04-07 17:14:51,390 [com.unmi.TestSlf4j]-[INFO] Hello SLF4J
把這種 SLF4J+Log4J 的使用模式與曾為霸主地位的 JCL+Log4J 的用法進行一下對比(請忽略掉包文件中的版本號):
SLF4J+Log4j 組合 對比 JCL+Log4J 組合 slf4j-api-1.5.11.jar 相當,定義高層 API commons-logging-1.1.jar      slf4j-log4j12-1.5.11.jar 相當,左邊是用綁定包,右邊 是用配置文件來指定日志實現 commons-logging.properties,內容為: 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 一樣,原來怎么配置現在也是 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 支持參數化,而 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 來告知用哪種日志實現,而 JCL 是通過配置文件來獲得該選擇哪個日志實現。
為什么會興起 SLF4J,看看我們原來哪一個框架中,大的如 SSH 三雄(Spring、Struts、Hibernate),還有 WAS 應用服務器,小的就不計其數以前用的通用日志框架都清一色的 Jakarta Commons Logging(JCL),日志實現會選用 Log4j,為何現在 Hibernate、Tapesty、DbUnit、Jetty V6 等紛紛變節,都采用了 SLF4J 了呢?SLF4J 與 JCL 相比,定然是有其可表之處。 而其中 SLF4J 受類加載器的影響較小,不易產生內存溢出的問題,性能得到了改善,更主要是順應了潮流的發展--可方便部署到 OSGI 環境中
----------------------------------------------------------------------------------------------------------------------------------------------------
二 》SLF4J+LogBack
前面講的 SLF4J 的用法之一是 SLF4J+Log4J,而這里要推出的組合是 SLF4J+LogBack。不用 Log4J?難道還有比 Log4J 更好的日志實現嗎?是的,答案就是 LogBack。假如你知道 LogBack 和 Log4J 是同出一位大師之手,你就不會覺得驚訝了。LogBack 對 Log4J 進行了增強,並投入了 SLF4J 的懷抱,它還被作者認定為 Log4J 的繼任者。
為什么叫做 Logback,我就不知道了,反正不要叫做 Brokeback 就行。這里是推崇用 Logback 替代 Log4J 的十幾個理由:Reasons to prefer logback over log4j,說的大至是更快;好測試;與 SLF4J 關系緊;文檔豐富;能自動加載配置文件;多個 JVM 寫一個日志文件,或其他 I/O 錯誤時不影響程序執行;配置文件中加入條件控制;強大的日志過濾;更強的日志切分功能;自動壓縮、刪除日志文件;異常棧中更多的數據信息。
Logback 分為三個模塊:logback-core,logback-classic,logback-access。logback-core 是核心;logback-classic 改善了 log4j,且自身實現了 SLF4J API,所以即使用 Logback 你仍然可以使用其他的日志實現,如原始的 Log4J,java.util.logging 等;logback-access 讓你方便的訪問日志信息,如通過 http 的方式。
還得提一點,Logback 能更好的放到 OSGI 環境中。好了,簡單紹完了 Logback,就來看看具體怎么用它。
需要的配置文件和組件包,下面三個 jar 文件和一個 xml文件都是要放在項目的 ClassPath 上。
1. slf4j-api-1.5.11.jar 2. logback-core-0.9.20.jar 3. logback-classic-0.9.20.jar 4. logback.xml 或 logback-test.xml (類似於 log4j.properties/log4j.xml)
前一個包在 http://www.slf4j.org/download.html 處下載,第二第三個包在 http://logback.qos.ch/download.html 下載,可能包文件名中的版本號有些差,不要緊。由於這里不演示 HTTP 訪問日志信息,所以不需要用到 logback-access-0.9.20.jar。
Logback 先找 logback-test.xml,沒有則找 logback.xml 文件,都找不到就使用 BasicConfigurator 基本配置,BasicConfigurator 就是相當於等會貼出的 logback.xml 文件內容的配置。這里我們用 logback.xml 配置文件,以前的 log4j.properties  文件可以用 PropertiesTranslator 轉換成 logback.xml 文件內容。
下面是一個最簡單的 logback.xml 文件內容 
01.<?xml version="1.0" encoding="UTF-8"?>  
02.<configuration>
03. <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
04. <encoder charset="GBK">
05. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
06. </encoder>
07. </appender>
08.
09. <root level="DEBUG">
10. <appender-ref ref="stdout" />
11. </root>
12.</configuration>

 
在 log4j.xml 能做的配置,logback.xml 中也能做到,而且還增強了諸如 <if><then><else>、<filter>、<sift> 等更強的控制,請參考 logback 的手冊 http://logback.qos.ch/manual/index.html。
使用 Logback  的代碼 
01.package com.unmi; 
02.
03.import org.slf4j.Logger;
04.import org.slf4j.LoggerFactory;
05.
06.public class TestLogback {
07. private static final Logger logger = LoggerFactory.getLogger(TestLogback.class);
08.
09. public static void main(String[] args) {
10. logger.info("Hello {}","TestLogback");
11. }
12.}


可以看到與使用 SLF4J 的代碼沒有任何區別,因為本來用的通用日志框架就是 SLF4J,說到底,這里的 Logback 就相當於 SLF4J+Log4J 使用方式中的 Log4J 綁定和 Log4J 的功能。
執行上面的代碼,輸出:
21:38:43.031 [main] INFO  com.unmi.TestLogback - Hello TestLogback
還是和上次一樣,這里就拿 SLF4J+Logback 和 SLF4J+Log4J 兩種方式作下比較:
SLF4J+Logback 組合 對比 SLF4J+Log4J 組合 slf4j-api-1.5.11.jar 一樣的,定義高層 API slf4j-api-1.5.11.jar logback-classic-0.9.20.jar 都是用綁定, 左邊這里用作 Logback 綁定 slf4j-log4j12-1.5.11.jar logback-classic-0.9.20.jar 左邊這里用作 日志實現 log4j-1.2.15.jar logback-test.xml/logback.xml 相當,logback 增加 了 log4j log4j.properties/log4j.xml 程序代碼中: import org.slf4j.Logger; import org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(TestSlf4j.class); logger.info("Hello {}","SLF4J"); 完全一樣,實質上只是 SLF4J API 侵入到了應用組件 中了,與 Logback 沒有關系。 程序代碼中: import org.slf4j.Logger; import org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(TestLogback.class); logger.info("Hello {}","Logback");
通過上面我們更清楚的發現,SLF4J+Logback 這樣的組合與 SLF4J+Log4J 這樣的用法其實沒有什么差異。SLF4J 在使用其他日志實現框架的時候都是 SLF4J+相應綁定+日志實現,這里縮寫成的 SLF4J+Log4J,中間是有一個 SLF4J 到 Log4J 的綁定的。完整表述它們就是:
SLF4J+Log4J 的方式:    slf4j-api-1.5.11.jar + slf4j-log4j12-1.5.11.jar + log4j-1.2.15.jar SLF4J+Logback 的方式:slf4j-api-1.5.11.jar + logback-classic-0.9.20.jar + logback-classic-0.9.20    前一個 logback-classic-0.9.20.jar 是作為綁定用的,后一個是作為日志實現用的,也就是 logback-classic-0.9.20.jar 把前面的 slf4j-log4j12-1.5.11.jar 和 log4j-1.2.15.jar 兩個包的功能揉合在了一起。
搞明白了 Logback 在其中所擔當的角色后,我們就知道,說使用了 Logback 應用組件,實際它們所用的統一日志組件只是 SLF4J。也可以說 Logback 就是 Log4J 那樣,只是自身帶了綁定的日志實現。
在 Logback 官方首頁 http://logback.qos.ch/ 面中可以看到使用了 Logback 的項目。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM