SLF4J只是一個門面(facet),它不包含具體的實現,而是將一些log4j,java.logging等實現包裝成統一的接口。借用下圖展示了常用日志文件的關系:
通過上面的圖,可以簡單的理清關系!
commons-logging和slf4j都是日志的接口,供用戶使用,而沒有提供實現!
log4j,logback等等才是日志的真正實現。
當我們調用接口時,接口的工廠會自動尋找恰當的實現,返回一個實現的實例給我服務。這些過程都是透明化的,用戶不需要進行任何操作!
這裡有個小故事,當年Apache說服 log4j以及其他的日志來按照commons-logging的標准編寫,但是由於commons-logging的類加載有點問題,實現起來也不友 好,因此log4j的作者就創作了slf4j,也因此而與commons-logging兩分天下。至於到底使用哪個,由用戶來決定吧。
這樣,slf4j出現了,它通過簡單的實現就能找到符合自己接口的實現類,如果不是滿足自己標准的日志,可以通過一些中間實現比如上面的slf4j-log4j12.jar來進行適配。
好,言歸正傳,如何使用slf4j?
一、使用slf4j快速入門
首先,項目中必須要包括slf4j-api.jar,此外,還應該包括slf4j為具體實現所提供的適配器(如slf4j-log4j12.jar),以及那個具體實現的jar包(如log4j-1.**.jar)。
我們以以下代碼為例:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jDemo {
private static final Logger LOG = LoggerFactory.getLogger(Slf4jDemo.class);
public static void main(String[] args) {
LOG.error("Error Message!");
LOG.warn("Warn Message!");
LOG.info("Info Message!");
LOG.debug("Debug Message!");
LOG.trace("Trace Message!");
}
}
由於所使用的具體實現不同,日志輸出也有不同的結果。這也反應了通過使用slf4j,使得可以方便的替換日志系統。
(一)Slf4j-simple
slf4j自帶的一個簡單實現,可用於小項目中,但無法配置日志級別等。
官方文檔中的描述為:Binding for Simple implementation, which outputs all events to System.err. Only messages of level INFO and higher are printed. This binding may be useful in the context of small applications.
在項目的build_path中加入slf4j-1.6.6.jar與slf4j-simple-1.6.6.jar。
輸出結果如下:
2 [main] ERROR Slf4jDemo - Error Message!
2 [main] WARN Slf4jDemo - Warn Message!
2 [main] INFO Slf4jDemo - Info Message!
(二)slf4j-jdk
使用jkd自帶的日志系統,在項目的build_path中加入slf4j-1.6.6.jar與slf4j-jdk14-1.6.6.jar。
輸出結果如下:
二月 16, 2015 11:09:36 下午 Slf4jDemo main
嚴重: Error Message!
二月 16, 2015 11:09:36 下午 Slf4jDemo main
警告: Warn Message!
二月 16, 2015 11:09:36 下午 Slf4jDemo main
信息: Info Message!
(三)slf4j-log4j
log4j是目前用得最多的日志系統,它更適用於大型項目。
在項目的build_path中加入slf4j-1.6.6.jar與slf4j-log4j-1.6.6.jar,以及log4j的具體實現,如log4j-1.2.16.jar。
輸出結果如下:
log4j:WARN No appenders could be found for logger (Slf4jDemo).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
可以通過配置文件配置輸出日志的級別。
二、一些注意事項
1、注意build_path中不能有多個日志實現,否則會導致slf4j不知道該使用哪個實現,從而出現以下錯誤
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/liaoliuqing/99_Project/1_myCodes/5_JavaEEDemo/lib/slf4j-log4j12-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/liaoliuqing/99_Project/1_myCodes/5_JavaEEDemo/lib/slf4j-jdk14-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
log4j:WARN No appenders could be found for logger (Slf4jDemo).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
2、log4j的配置請見http://www.linuxidc.com/Linux/2014-10/108401.htm