1. 程式人生 > >Java日誌框架梳理-Java日誌框架總覽

Java日誌框架梳理-Java日誌框架總覽

常見的Java日誌框架

  • log4j
  • logback
  • j.u.l (java.util.logging)

常見的Java日誌門面

  • SLF4J
  • commons-logging

其中,j.u.l是Java原生庫,但是在Java 1.4中才被引用; commons-logging出自Apache,用於橋接j.u.l和log4j;log4j、logback和SLF4J出自同一個作者(Ceki),目前被廣泛應用於開源專案中。以上日誌框架、日誌門面出現時間線如圖:

這裡寫圖片描述

  本節按上述框架、門面出現的時間順序簡單介紹各個節點

log4j

  在JDK 1.3及以前,Java打日誌依賴System.out.println(), System.err.println()或者e.printStackTrace(),Debug日誌被寫到STDOUT流,錯誤日誌被寫到STDERR流。這樣打日誌有一個非常大的缺陷,即無法定製化,且日誌粒度不夠細。log4j是在這樣的環境下誕生的,它是一個里程碑式的框架,它定義的Logger、Appender、Level等概念如今已經被廣泛使用。
  
  

j.u.l

  受Logj啟發,Sun在Java1.4版本中引入了java.util.logging,但是j.u.l功能遠不如log4j完善,開發者需要自己編寫Appenders(Sun稱之為Handlers),且只有兩個Handlers可用(Console和File),j.u.l在Java1.5以後效能和可用性才有所提升。

commons-logging (Jakarta Commons Logging: j.c.l)

  由於專案的日誌列印必然以來兩個框架中至少一個,這時候,Apache的commons-logging誕生了。commons-logging不是一個日誌列印框架,而是一個API bridge,開發者可以使用它相容不同的日誌框架(log4j和j.u.l)。然而,commons-logging對Log4j和j.u.l的配置問題相容的並不好,使用commons-loggings還可能會遇到類載入問題,導致NoClassDefFoundError的錯誤出現。

SLF4J

  最終,log4j的創始人Ceki發起了SLF4J(Simple Logging Facade for Java)專案,從設計模式的角度說,它是用來在log和程式碼層之間起到門面作用,對於使用者來說只要使用SLF4J提供的介面,即可隱藏日誌的具體實現,SLF4J提供的核心API是一些介面和一個LoggerFactory的工廠類,使用者只需按照它提供的統一紀錄日誌介面,最終日誌的格式、紀錄級別、輸出方式等可通過具體日誌系統的配置來實現,因此可以靈活的切換日誌系統。

  • 引數化列印日誌(parameterized logging)
logger.error("the exception message is {}"
, message);

logback

  logback和log4j是同一個作者創作,它是log4j的升級版,因此logback相較於log4j有更多的優點:

  • 原生實現了SLF4J API(log4j需要一箇中間層轉換)
  • 支援XML、Groovy方式配置
  • 支援配置檔案中加入條件判斷
  • 更強大的過濾器
  • 更豐富的免費文件
  • 更充分的測試
  • 自動過載有變更的配置檔案
  • 自動壓縮歷史日誌
  • 列印異常資訊時自動包含pachage名稱及版本號
  • 其他特性

      日誌框架的使用基本都會結合日誌門面,關於commons-logging (j.c.l)的使用詳見參考內容3。
      鑑於SLF4J使用較為廣泛,下文主要介紹SLF4J的使用方法,SLF4J的使用方式有兩種,一種是混合繫結(concrete-bindings),另一種是橋接遺產(bridging-legacy)。
      混合繫結模式指在專案中直接食用SLF4J來列印日誌,而底層繫結任意一種日誌框架,如:log4j、logback、j.u.l等。混合繫結根據實現原理又分為兩種:有介面卡(adapter)繫結、無介面卡繫結。有介面卡繫結是指底層沒有實現SLF4J的介面,而是通過介面卡呼叫底層日誌框架的logger,無介面卡繫結是指其本身實現了SLF4J的全部介面(logback),不需要呼叫其他日誌框架的logger。幾種混合繫結包簡介:

  • slf4j-log4j12-1.7.21.jar : 有介面卡,繫結log4j,logger由log4j-1.2.17.jar提供

  • slf4j-jdk14-1.7.21.jar : 有介面卡,繫結j.u.l,logger由j.u.l提供
  • logback-classic-1.0.13.jar : 無介面卡,logback實現了SLF4J的全部介面
  • slf4j-simple-1.7.21.jar : 無介面卡,slf4j的簡單實現,僅列印info及以上級別的日誌,所有輸出重定向到System.err,適合小應用。

      後續分別介紹有介面卡的混合繫結(slf4j + log4j)和無介面卡的混合繫結(slfj + logback)的具體實現。