slf4j, Simple Logging Facade for Java 的包使用說明

Link: http://windows9834.blog.163.com/blog/static/27345004201071915749769/


全稱:Simple Logging Facade for Javahttp://www.slf4j.org/

簡單日誌門面(Facade)SLF4J是爲各種loging APIs提供一個簡單統一的接口,從而使得最終用戶能夠在部署的時候配置自己希望的loging APIs實現。
Logging API實現既可以選擇直接實現SLF4J接口的loging APIs如: logback、SimpleLogger。也可以通過開發相應的適配器來使用已有的API實現如
Log4jLoggerAdapter、JDK14LoggerAdapter。

SLF4J 不依賴任何特殊的class loader機制,實際上,SLF4J 和已有日誌實現的綁定是在編譯時靜態執行的,具體綁定工作是通過一個jar包實現的,使用時只要把相應的jar包(只有一個)放到類路徑上即可。
在SLF4J發行版本中包含了幾個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支持多個日誌系統,比如NOP, Simple, log4j version 1.2, log4j version 1.3, JDK 1.4 logging, JCL and logback。

使用slf4j儘管很方便,但是讓很多人搞不明白slf4j那麼多包怎麼用。

其實slf4j原理很簡單,他只提供一個核心slf4j api(就是slf4j-api.jar包),這個包只有日誌的接口,並沒有實現,所以如果要使用就得再給它提供一個實現了些接口的日誌包,比如:log4j,common logging,jdk log日誌實現包等,但是這些日誌實現又不能通過接口直接調用,實現上他們根本就和slf4j-api不一致,因此slf4j又增加了一層來轉換各日誌實現包的使用,當然slf4j-simple除外。其結構如下:

slf4j-api(接口層)
   |
各日誌實現包的連接層( slf4j-jdk14, slf4j-log4j)
   |
各日誌實現包

下面這個圖更能說明其原理:

在這裏還需要注意的是,連接層的jar包和實現的jar的版本要一致。
附jar說明:
slf4j-api-1.6.1.jar         -->  slf4j核心接口包
slf4j-simple-1.6.1.jar      -->  slf4j Simple Logger日誌實現包
slf4j-nop-1.6.1.jar         -->
slf4j-migrator-1.6.1.jar    -->
slf4j-log4j12-1.6.1.jar     -->  slf4j調用log4j的實現包
slf4j-jdk14-1.6.1.jar       -->  slf4j調用jdk java.util.logging的實現包
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 的用法進行一下對比(請忽略掉包文件中的版本號):

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 環境中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章