slf4j只是一個門面(facet),它不包含具體的實現,而是將一些log4j,java.logging等實現包裝成統一的接口。
commons-logging和slf4j都是日誌的接口,供用戶使用,而沒有提供實現!java
log4j,logback等等纔是日誌的真正實現。框架
當咱們調用接口時,接口的工廠會自動尋找恰當的實現,返回一個實現的實例給我服務。這些過程都是透明化的,用戶不須要進行任何操做!ui
能夠與slf4j組合使用的日誌框架實現有:spa
Slf4j-simple,slf4j自帶的一個簡單實現,可用於小項目中,但沒法配置日誌級別等。
debug
slf4j-jdk,使用jkd自帶的日誌系統,在項目的build_path中加入slf4j-1.6.6.jar與slf4j-jdk14-1.6.6.jar。日誌
slf4j-log4j log4j是目前用得最多的日誌系統,它更適用於大型項目。 在項目的build_path中加入slf4j-1.6.6.jar與slf4j-log4j-1.6.6.jar,以及log4j的具體實現,如log4j-1.2.16.jar。code
FAQ:接口
注意build_path中不能有多個日誌實現,不然會致使slf4j不知道該使用哪一個實現,從而出現如下錯誤:ip
SLF4J: Class path contains multiple SLF4J bindings.
因爲不少項目都會使用log4j做爲日誌框架,而在一個項目的引用包中的log4j配置文件有可能將本身定義的log4j.properties文件覆蓋。若是發現本身的log4j配置文件不生效,則使用:java -Dlog4j.debug 主類來檢查目前加載了哪一個配置文件,而後將其刪除便可。class
另外,即便使用了PropertyConfigurator.configure(「log4j2.properties」); 指定配置文件,也有可能被第三方jar包使用一樣語句覆蓋了。
CLASSPATH中不能有多個log4j的版本本,不然有有奇形怪狀的NoSuchMethod, NoSuchFiled, NoClassDefineFound等異常。
配置文件啊,若是你引用的第三方包有log4j.properties,而又沒有提供給你編輯,那恭喜你,慢慢調吧。把log4j的配置寫入代碼吧,不要用配置文件了
若是你打算只使用log4j,而不使用slf4j做包裝,切記classpath中只能有log4j,不能有log4j-over-slf4j-1.7.12.jar這種包,否則會出現各類各樣的錯誤,如: NoSuchMethod, NoSuchFiled, NoClassDefineFound, IncompatibleClassChangeError: Implementing class