天天看點

log4j、logback、slf4j的差別和聯系

1. 常見的Java日志架構

實作架構:
	log4j   :出現于JDK 1.3之前,它定義了Logger、Appender、Level等概念
	log4j2  :log4j的重寫版
    j.u.l (java.util.logging) : Java原生庫,始于Java 1.4,Java1.5以後性能和可用性才有所提升
    logback  :log4j的更新版,更多的新特性
    
門面架構:
	SLF4J   :由log4j的創始人Ceki發起,隻提供接口和工廠類,在log和代碼層之間起到門面作用
    commons-logging    :出自于Apache,用于橋接j.u.l和log4j
           

log4j、logback和SLF4J出自同一個作者(Ceki),目前被廣泛應用于開源項目中

2. 概念

  • Logger

    Logger是一個允許應用記錄日志的對象,開發者不必需考慮輸出位置。

    應用可将具體需要列印的資訊通過一個Object傳遞。每個Logger互相獨立,通過名字或辨別符來區分。

  • Appender

    每個appender可獨立配置記錄日志的裝置,可以是

    控制台

    檔案

    資料庫

    消息系統

    等。
  • Level

    每個列印日志都可以單獨制定日志級别。

    外部通過配置檔案來控制輸出級别,不同的輸出級别列印不同的日志資訊。

    DEBUG

    <

    INFO

    <

    WARN

    <

    ERROR

    <

    FATAL

    (目前日志的重要程度)
  • Logout (Layout)

    使用者可以根據需求格式化日志輸出,log4j可以在Appenders後面附加Layouts來完成

    一般提供四種日志輸出格式:

    如HTML樣式、包含日志級别/時間/線程/類别等資訊的樣式等

3. SLF4J的用法

混合綁定(concrete-bindings):

  混合綁定模式指在項目中直接使用

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,适合小應用。

橋接遺産(bridging-legacy):

  主要針對曆史遺留項目, 不論是用log4j寫的, j.c.l寫的,還是j.u.l寫的項目,

  都可以在不改動代碼的情況下具有另外一種日志架構的能力。

  具體用法見參考文章1

4. 參考文章:

1.那些年我們用過的日志架構

2.Java日志架構梳理-Java日志架構總覽