日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

使用Slf4 j取代系統(tǒng)已有的 Apache Common-Logging 實現(xiàn)日志

 CevenCheng 2010-09-08

Apache Common-Logging是廣泛使用的Java日志門面庫。我以前一直都使用它和log4j編寫日志。
Apache Common-Logging通過動態(tài)查找的機制,在程序運行時自動找出真正使用的日志庫。
Apache Common-Logging一直都運作得很好。直到最近,我寫OSGI插件時,它不能工作了。
原因是Apache Common-Logging使用了ClassLoader尋找和載入底層的日志庫。而OSGI中,不同的插件使用自己的ClassLoader。
一個線程的ClassLoader在執(zhí)行不同的插件時,其執(zhí)行能力是不同的。
OSGI的這種機制保證了插件互相獨立,然而確使Apache Common-Logging無法工作!

解決之道是使用新的日志門面庫Slf4j。
Slf4j庫類似于Apache Common-Logging。但是,他在編譯時靜態(tài)綁定真正的Log庫。使用Slf4j時,如果你需要使用某一種日志實現(xiàn),那么你必須選擇正確的Slf4j的jar包的集合。
這確實麻煩了一點,但總算可以在OSGI中開發(fā)日志了。

其實,這一點點工作也不算麻煩。

使用CommonLog接口而實際由Slf4j和Log4j實現(xiàn)的過程
1,項目中照常使用

1
2
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

編寫日志。

2,仍然在src下使用log4j.properties文件進(jìn)行配置。

3,使用的所有jar文件:
1)log4j-1.2.15.jar 這是log4j的庫。 Slf4j并不改變這個底層實現(xiàn)庫。
2)slf4j-api-1.5.2.jar 這是Slf4j庫。
3)slf4j-log4j12-1.5.2.jar 這包含Log4j的適配器和靜態(tài)綁定log4j底層實現(xiàn)。
4)jcl-over-slf4j-1.5.2.jar 這提供了Commons-Logging接口,以及使用common-loggin的接口,底層還是由SLF4J來決定哪種實現(xiàn)機制 。

這里,我們需要使用Log4j的原生庫,但是不需要Commons-Logging的原生庫。
OK,把上面這4個jar包復(fù)制到lib下,導(dǎo)入項目中,就可以像以往一樣繼續(xù)使用Apache Common-Logging編寫日志了。
如果你喜歡使用slf4j的門面類,或者非log4j的日志實現(xiàn)庫。只需要像上面把需要的jar包扔進(jìn)自己的項目即可!

項目日志系統(tǒng)將會扔掉commons-logging和log4j,使用SLF4J全面接管,無障礙遷移。
優(yōu)點:

  • 超超超低依賴性
  • 透明切換不同是日志實現(xiàn)方式
  • 編譯器綁定底層實現(xiàn)的方式,不會有classloader問題
  • 性能更佳
  • 已經(jīng)Hibernate、Jetty、Spring-OSGi、Tapestry等項目中使用
  • 完善又免費的文檔

各個jar包功能:

  • slf4j-api-1.4.3.jar - 一定是要的,直接支持logback實現(xiàn)
  • jcl104-over-slf4j-1.4.3.jar - 使用common-loggin的接口,底層還是由SLF4J來決定哪種實現(xiàn)機制
  • slf4j-jcl-1.4.3.jar - 使用SLF4J的接口,底層由common-loggin實現(xiàn)(不能和jcl104-over-slf4j-1.4.3.jar同時使用)
  • slf4j-log4j12-1.4.3.jar - 使用SLF4J的接口,底層由log4j實現(xiàn)
  • slf4j-jdk14-1.4.3.jar - 使用SLF4J的接口,底層由java自身的日志系統(tǒng)實現(xiàn)

語法:

1
2
3
4
5
6
7
8
9
10
11
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class Test {
    final Logger logger = LoggerFactory.getLogger(Test.class);
 
    public void hi() {
        // 不再需要log.isDebugalbe(),代碼更簡潔
        logger.debug("hello {}", "amsz");
    }
}

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多