Java日誌框架

java很火,日誌記錄又是必需,所以就有了大量的日誌記錄框架,在平常使用時由於日誌框架衝突引起各類問題,本文對之進行梳理,適合入門。因爲做者水平限制,本文可能不夠清晰甚至有錯,煩請指出。在文章末尾的參考部分,有幾位大牛總結的文章,推薦給你們。html

下文將着重介紹上述日誌框架的區別,以及避免不一樣框架組合引入時的衝突。java

兩個概念

日誌系統

日誌接口的具體實現。經典的有log4j,jdk自帶的有java.util.Logging,還有log4j做者推出的被高度評價的logBack等等。apache

日誌接口(門面)

若是隻存在一種日誌系統,日誌接口徹底沒有必要存在(logBack沒法獨立使用)。但事與願違,爲了解決多個日誌系統的兼容問題,日誌接口應運而生。主流的日誌接口有commons-logging和sl4j。api

日誌框架介紹

  • Log4j(Log for Java) Apache Log4j是一個基於Java的日誌記錄工具。它是由Ceki Gülcü獨創的,如今則是Apache軟件基金會的一個項目。
  • Log4j 2 Apache Log4j 2是apache開發的一款Log4j的升級產品,Log4j 2 不兼容Log4j。各個方面都與Logback很是類似。
  • Commons Logging Apache基金會所屬的項目,是一套Java日誌接口,以前叫Jakarta Commons Logging,後改名爲Commons Logging。
  • Slf4j(Simple Logging Facade for Java) 相似於Commons Logging,是一套簡易Java日誌門面,自己並沒有日誌的實現。
  • Logback 一個「可靠、通用、快速而又靈活的Java日誌框架」,屬於(Slf4j陣營)
  • Jul(Java Util Logging) 自Java1.4以來的官方日誌實現

Java經常使用日誌框架歷史

1996年早期,歐洲安全電子市場項目組決定編寫它本身的程序跟蹤API(Tracing API)。通過不斷的完善,這個API終於成爲一個十分受歡迎的Java日誌軟件包,即Log4j。後來Log4j成爲Apache基金會項目中的一員。安全

期間Log4j近乎成了Java社區的日誌標準。聽說Apache基金會還曾經建議sun引入Log4j到java的標準庫中,但Sun拒絕了。框架

2002年Java1.4發佈,Sun推出了本身的日誌庫JUL(Java Util Logging),其實現基本模仿了Log4j的實現。在JUL出來之前,log4j就已經成爲一項成熟的技術,使得log4j在選擇上佔據了必定的優點。工具

接着,Apache推出了Jakarta Commons Logging,JCL只是定義了一套日誌接口(其內部也提供一個Simple Log的簡單實現),支持運行時動態加載日誌組件的實現,也就是說,在你應用代碼裏,只需調用Commons Logging的接口,底層實現能夠是log4j,也能夠是Java Util Logging。性能

後來(2006年),Ceki Gülcü不適應Apache的工做方式,離開了Apache。而後前後建立了slf4j(日誌門面接口,相似於Commons Logging)和Logback(Slf4j的實現)兩個項目,並回瑞典建立了QOS公司,QOS官網上是這樣描述Logback的:The Generic,Reliable Fast&Flexible Logging Framework(一個通用,可靠,快速且靈活的日誌框架)。.net

現今,Java日誌領域被劃分爲兩大陣營:Commons Logging陣營和SLF4J陣營。
Commons Logging在Apache大樹的籠罩下,有很大的用戶基數。但有證據代表,形式正在發生變化。2013年末有人分析了GitHub上30000個項目,統計出了最流行的100個Libraries,能夠看出slf4j的發展趨勢更好:debug

輸入圖片說明

Apache眼看有被Logback反超的勢頭,於2012-07重寫了log4j 1.x,成立了新的項目Log4j 2。Log4j 2具備logback的全部特性。

框架對比

  • Commons Logging和Slf4j是日誌門面,log4j和Logback則是具體的日誌實現方案。
  • 比較經常使用的組合使用方式是Slf4j與Logback組合使用,Commons Logging與Log4j組合使用。

至此,你應該瞭解了它們之間的區別,下面就說說使用時jar包的引入,避免衝突

日誌組件的橋接

若是你是Commons Logging系,那麼最主流的組合Commons Logging + Log4j是你最好的選擇。

Commons Logging + Log4j 須要引入的包

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

若是你是Slf4j系,Slf4j + Logback組合是你最佳的選擇,固然也有人願意用Slf4j + Slf4j-Log4j + Log4j。

Slf4j + Logback 須要引入的包

<dependency>  
    <groupId>org.slf4j</groupId>  
    <artifactId>slf4j-api</artifactId>  
    <version>1.6.0</version>  
    <type>jar</type>  
    <scope>compile</scope>  
</dependency>  
<dependency>  
    <groupId>ch.qos.logback</groupId>  
    <artifactId>logback-core</artifactId>  
    <version>0.9.28</version>  
    <type>jar</type>  
</dependency>  
<dependency>  
    <groupId>ch.qos.logback</groupId>  
    <artifactId>logback-classic</artifactId>  
    <version>0.9.28</version>  
    <type>jar</type>  
</dependency>

Slf4j + Slf4j-Log4j + Log4j須要引入的包

<dependency>  
        <groupId>org.slf4j</groupId>  
        <artifactId>slf4j-api</artifactId>  
        <version>1.7.12</version>  
</dependency>  
<dependency>  
        <groupId>org.slf4j</groupId>  
        <artifactId>slf4j-log4j12</artifactId>  
        <version>1.7.12</version>  
</dependency>  
<dependency>  
        <groupId>log4j</groupId>  
        <artifactId>log4j</artifactId>  
        <version>1.2.17</version>  
</dependency>

建議選好一個組合後,嚴格按照以上導包(包的版本自行選擇),這樣作將很大程度上的避免衝突。

特別注意:Logback和Slf4j-Log4j12互斥,若是項目中同時存在,會引起衝突。

輸入圖片說明

固然,Slf4j還有不少組合,可能也有項目用到,本文再也不一一說明:

輸入圖片說明

在項目中選擇日誌框架

若是是在一個新的項目中建議使用Slf4j + Logback組合,這樣有以下的幾個優勢。

  1. Slf4j實現機制決定Slf4j限制較少,使用範圍更廣。因爲Slf4j在編譯期間,靜態綁定本地的LOG庫使得通用性要比Commons logging要好。
  2. Logback擁有更好的性能

    Logback聲稱:某些關鍵操做,好比斷定是否記錄一條日誌語句的操做,其性能獲得了顯著的提升。這個操做在Logback中須要3納秒,而在Log4J中則須要30納秒。LogBack建立記錄器(logger)的速度也更快:13毫秒,而在Log4J中須要23毫秒。更重要的是,它獲取已存在的記錄器只需94納秒,而Log4J須要2234納秒,時間減小到了1/23。跟JUL相比的性能提升也是顯著的。
  3. Commons Logging開銷更高

    在使Commons Logging時爲了減小構建日誌信息的開銷,一般的作法是:

    if(log.isDebugEnabled()){
    log.debug("User name: " +
    user.getName() + " buy goods id :" + good.getId());
    }

    在Slf4j陣營,你只需這麼作:

    log.debug("User name:{} ,buy goods id :{}", user.getName(),good.getId());

    也就是說,slf4j把構建日誌的開銷放在了它確認須要顯示這條日誌以後,減小內存和cup的開銷,使用佔位符號,代碼也更爲簡潔

  4. Logback文檔免費。Logback的全部文檔是全面免費提供的,不象Log4J那樣只提供部分免費文檔而須要用戶去購買付費文檔。

參考

  1. Java經常使用日誌框架介紹
  2. Log4j、Log4j 二、Logback、SFL4J、JUL、JCL的比較
  3. java 日誌框架日誌系統關係詳解
  4. Java日誌框架
  5. Java日誌框架——SLF4J
相關文章
相關標籤/搜索