標籤:style http color os 使用 java ar strong 檔案
看現在有很多開源的軟體,log記錄都是用SLF4j,以前自己是用common-logging覺得十分方便,可以動態切換實際的log系統,這樣common-logging和SLF4J有什麼區別。
網上找了一篇文檔,覺得說明了一些問題:
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中開發日誌了。
其實,這一點點工作也不算麻煩。
使用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編寫日誌了。
SLF4j 和 common-logging