1. 程式人生 > >javaee日誌不同框架間切換

javaee日誌不同框架間切換

日誌最佳實現

前言

現在在市面上有很多日誌框架,有java原生api,也有陸陸續續很多種日誌框架,導致在專案維護及開發過程中 日誌api引用比較混亂。例如spring框架中使用了logback框架,裡面使用的都是logback的日誌api,而之前專案開發的依賴中使用的是log4j。自己現在開發過程中要是用log4j2框架,如果按照之前的方式需要配置散出日誌輸出配置,這樣開發維護起來很不方便。
現在打算在一處進行日誌配置,對日誌進行集中管理,更改之前依賴原始碼是不現實的。但是要配置多處日誌配置管理起來也很費勁。針對這種問題,出現了兩種框架JCL(Commons Logging) 以及slf4j。這兩種框架都是日誌的介面,供使用者使用,而沒有提供實現!
下面將以slf4j的使用,來達到不更改原來框架原始碼的前提下,更改框架底層框架輸出,達到日誌的統一管理。

日誌關係

在這裡插入圖片描述

一.不同日誌框架轉slf4j

說明:

現階段使用的是其他的日誌框架的api進行日誌輸出,但是現在將之前的日誌依賴包排除,交給slf4j框架進行統一管理日誌,需要進入的包。也就是將原來的日誌框架轉為slf4j,同時原來的程式碼不需要更改,只需將原來日誌依賴排除即可。

1.使用log4j2 轉為slf4j :log4j-to-slf4j

maven地址

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-to-slf4j</artifactId>
    <version>2.11.0</version>
</dependency> 

2 logback轉為slf4j:logback-classic

maven地址

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.0</version>
</dependency>

3 jul轉為slf4j:jul-to-slf4j

maven地址

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
    <version>1.7.21</version>
</dependency>

4 log4j轉為slf4j:log4j-over-slf4j

maven地址

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>1.7.22</version>
</dependency>

5 commons-logging轉為slf4j:jcl-over-slf4j

maven地址

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.21</version>
    <type>pom</type>
</dependency>

二.slf4j依賴具體實現

說明:

使用slf4j日誌介面框架輸出日誌,但是這僅僅是介面,並不能真正進行日誌輸出,因此需要通過橋樑來達到真正的日誌輸出,因此使用不同的日誌框架輸出需要不同的日誌橋樑。要點就是使用slf4japi進行日誌控制。

1.slf4j-jdk14:slf4j到jdk-logging的橋樑

maven地址

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-jdk14</artifactId>
    <version>1.7.21</version>
    <type>pom</type>
</dependency>

2.slf4j-log4j12:slf4j到log4j1的橋樑

maven地址

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.24</version>
    <type>pom</type>
</dependency>

3.log4j-slf4j-impl:slf4j到log4j2的橋樑

maven地址 注意:是apache

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.8.1</version>
</dependency>

4.logback-classic:slf4j到logback的橋樑

maven地址

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.0</version>
</dependency>

5.slf4j-jcl:slf4j到commons-logging的橋樑

maven地址

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.25</version>
    <type>pom</type>
</dependency>

三. 使用場景

1.原來專案中使用log4j日誌框架進行輸出,現在要轉為log4j2

再不改變原來程式碼前期下,需要操作

步驟一:將原來專案中關於log4j日誌相關jar包進行排除

步驟二:如果原來專案中有日誌配置,將日誌配置刪除

步驟三:匯入log4j轉為slf4j包,交由slf4j管理

 匯入上面一中的 log4j轉為slf4j:log4j-over-slf4j 包

步驟四:將slf4j具體實現類交由log4j2

匯入上面二中的log4j-slf4j-impl:slf4j到log4j2的橋樑

步驟五:匯入log4j2j所需要的jar包。


<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.5</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>2.5</version>
</dependency>

2. 其他框架也是採用類似1.

如果需要進行切換,將之前日誌框架輸出交給slf4j,然後由slf4j在指定具體日誌框架即可。
如果使用slf4j語言,一定要匯入具體實現的日誌jar包,通過不同的橋樑來達到使用slf4j的api操作日誌輸出的作用,還是那句話,slf4j只是介面。橋樑的作用就是將slf4j的介面進行實現,不同的橋樑呼叫不同的日誌jar包。當然配置檔案也需要根據所選日誌框架而定。

四.框架衝突

  1. jcl-over-slf4j 與 slf4j-jcl 衝突
    jcl-over-slf4j: commons-logging切換到slf4j
    slf4j-jcl : slf4j切換到commons-logging
    如果這兩者共存的話,必然造成相互委託,造成記憶體溢位
  2. log4j-over-slf4j 與 slf4j-log4j12 衝突
  3. jul-to-slf4j 與 slf4j-jdk14 衝突
  4. log4j-to-slf4j與slf4j-log4j12衝突