看如今有不少開源的軟件,log記錄都是用SLF4j,之前本身是用common-logging以爲十分方便,能夠動態的切換實際的log系統,這樣common-logging和SLF4J有什麼區別。html
網上找了一篇文檔,以爲說明了一些問題:java
Apache Common-Logging是普遍使用的Java日誌門面庫。我之前一直都使用它和log4j編寫日誌。
Apache Common-Logging經過動態查找的機制,在程序運行時自動找出真正使用的日誌庫。
Apache Common-Logging一直都運做得很好。直到最近,我寫OSGI插件時,它不能工做了。
緣由是Apache Common-Logging使用了ClassLoader尋找和載入底層的日誌庫。而OSGI中,不一樣的插件使用本身的ClassLoader。
一個線程的ClassLoader在執行不一樣的插件時,其執行能力是不一樣的。
OSGI的這種機制保證了插件互相獨立,然而確使Apache Common-Logging沒法工做!
解決之道是使用新的日誌門面庫Slf4j。
Slf4j庫相似於Apache Common-Logging。可是,他在編譯時靜態綁定真正的Log庫。使用Slf4j時,若是你須要使用某一種日誌實現,那麼你必須選擇正確的Slf4j的jar包的集合。
這確實麻煩了一點,但總算能夠在OSGI中開發日誌了。
其實,這一點點工做也不算麻煩。 apache
使用CommonLog接口而實際由Slf4j和Log4j實現的過程
1,項目中照常使用
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
編寫日誌。
2,仍然在src下使用log4j.properties文件進行配置。
3,使用的全部jar文件:
1)log4j-1.2.15.jar 這是log4j的庫。 Slf4j並不改變這個底層實現庫。
2)slf4j-api-1.5.2.jar 這是Slf4j庫。
3)slf4j-log4j12-1.5.2.jar 這包含Log4j的適配器和靜態綁定log4j底層實現。
4)jcl-over-slf4j-1.5.2.jar 這提供了Commons-Logging接口,以及使用common-loggin的接口,底層仍是由SLF4J來決定哪一種實現機制 。
這裏,咱們須要使用Log4j的原生庫,可是不須要Commons-Logging的原生庫。
OK,把上面這4個jar包複製到lib下,導入項目中,就能夠像以往同樣繼續使用Apache Common-Logging編寫日誌了。 api