天天看點

Java日志體系學習2--日志門面JCL&Slf4j

JCL

全稱為Jakarta Commons Logging,是Apache提供的一個通用日志API。 它是為 "所有的Java日志實作"提供一個統一的接口,它自身也提供一個日志的實作,但是功能非常常弱 (SimpleLog)。是以一般不會單獨使用它。他允許開發人員使用不同的具體日志實作工具: Log4j, Jdk 自帶的日志(JUL)。JCL是一種接口,具體要依賴于其他日志實作。

引入依賴:

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

檢視一下源碼,可知類結果很簡單 主要有Log和LogFactory。Log具體的實作類有

Java日志體系學習2--日志門面JCL&amp;Slf4j

 Log功能相對比較簡單,可以通過不同的實作來切換日志架構,JCL使用較少。

Slf4j

簡單日志門面(Simple Logging Facade For Java) SLF4J主要是為了給Java日志通路提供一套标準、規範 的API架構,其主要意義在于提供接口,具體的實作可以交由其他日志架構,例如log4j和logback等。 當然slf4j自己也提供了功能較為簡單的實作,但是一般很少用到。對于一般的Java項目而言,日志架構 會選擇slf4j-api作為門面,配上具體的實作架構(log4j、logback等),中間使用橋接器完成橋接。

Slf4j定義了日志接口 其自身也自帶了簡單實作

<!--slf4j core 使用slf4j必須添加-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.28</version>
    </dependency>
    <!--slf4j 自帶的簡單日志實作 -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.7.12</version>
    </dependency>
           
Java日志體系學習2--日志門面JCL&amp;Slf4j

slf4j-api接口類相對比較簡單 Logger 和ILoggerFactory。

Java日志體系學習2--日志門面JCL&amp;Slf4j

由于我們使用slf4j一般不使用其自帶的簡單實作,是以簡單測試一下。

使用slf4j-api的好處:

1. 使用SLF4J架構,可以在部署時遷移到所需的日志記錄架構。 

2. SLF4J提供了對所有流行的日志架構的綁定,例如log4j,JUL,Simple logging和NOP。是以可以 在部署時切換到任何這些流行的架構。 

3. 無論使用哪種綁定,SLF4J都支援參數化日志記錄消息。由于SLF4J将應用程式和日志記錄架構分離, 是以可以輕松編寫獨立于日志記錄架構的應用程式。而無需擔心用于編寫應用程式的日志記錄架構。 

4. SLF4J提供了一個簡單的Java工具,稱為遷移器。使用此工具,可以遷移現有項目,這些項目使用日志 架構(如Jakarta Commons Logging(JCL)或log4j或Java.util.logging(JUL))到SLF4J。

綁定日志

如前所述,SLF4J支援各種日志架構。SLF4J發行版附帶了幾個稱為“SLF4J綁定”的jar檔案,每個綁定對應 一個受支援的架構。

使用slf4j的日志綁定流程:

1. 添加slf4j-api的依賴

2. 使用slf4j的API在項目中進行統一的日志記錄

3. 綁定具體的日志實作架構 1. 綁定已經實作了slf4j的日志架構,直接添加對應依賴 2. 綁定沒有實作slf4j的日志架構,先添加日志的擴充卡,再添加實作類的依賴

4. slf4j有且僅有一個日志實作架構的綁定(如果出現多個預設使用第一個依賴日志實作)

引入相應的日志實作以及綁定依賴

<!--slf4j core 使用slf4j必須添加-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.28</version>
    </dependency>
    <!-- log4j-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.30</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
    <!-- jul -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-jdk14</artifactId>
      <version>1.7.25</version>
    </dependency>
    <!--jcl -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-jcl</artifactId>
      <version>1.7.27</version>
    </dependency>
    <!-- nop -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-nop</artifactId>
      <version>1.7.27</version>
    </dependency>
           
Java日志體系學習2--日志門面JCL&amp;Slf4j

可知slf4j-api在綁定不同的日志實作時有不同的擴充卡,其中log4j和jcl要通過擴充卡來切換。

SLF4J不依賴于任何特殊的類裝載。實際上,每個SLF4J綁定在編譯時都是硬連線的, 以使用一個且隻有 一個特定的日志記錄架構。隻需将您選擇的一個且隻有一個綁定放到相應的類路徑位置。不要在類路徑上放置多個綁定。

slf4j原理

1. SLF4J通過LoggerFactory加載日志具體的實作對象。

2. LoggerFactory在初始化的過程中,會通過performInitialization()方法綁定具體的日志實作。

3. 在綁定具體實作的時候,通過類加載器,加載org/slf4j/impl/StaticLoggerBinder.class

4. 是以,隻要是一個日志實作架構,在org.slf4j.impl包中提供一個自己的StaticLoggerBinder類,在 其中提供具體日志實作的LoggerFactory就可以被SLF4J所加載。

可以看一下上述兩個适配依賴的類結構

Java日志體系學習2--日志門面JCL&amp;Slf4j

logback目前使用較少,直接跳過。

具體可以參考:Logback Home