javaee日誌不同框架間切換
日誌最佳實現
- 前言
- 日誌關係
- 一.不同日誌框架轉slf4j
- 說明:
- 1.使用log4j2 轉為slf4j :log4j-to-slf4j
- 2 logback轉為slf4j:logback-classic
- 3 jul轉為slf4j:jul-to-slf4j
- 4 log4j轉為slf4j:log4j-over-slf4j
- 5 commons-logging轉為slf4j:jcl-over-slf4j
- 二.slf4j依賴具體實現
- 說明:
- 1.slf4j-jdk14:slf4j到jdk-logging的橋樑
- 2.slf4j-log4j12:slf4j到log4j1的橋樑
- 3.log4j-slf4j-impl:slf4j到log4j2的橋樑
- 4.logback-classic:slf4j到logback的橋樑
- 5.slf4j-jcl:slf4j到commons-logging的橋樑
- 三. 使用場景
- 1.原來專案中使用log4j日誌框架進行輸出,現在要轉為log4j2
- 步驟一:將原來專案中關於log4j日誌相關jar包進行排除
- 步驟二:如果原來專案中有日誌配置,將日誌配置刪除
- 步驟三:匯入log4j轉為slf4j包,交由slf4j管理
- 步驟四:將slf4j具體實現類交由log4j2
- 步驟五:匯入log4j2j所需要的jar包。
- 2. 其他框架也是採用類似1.
- 四.框架衝突
前言
現在在市面上有很多日誌框架,有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包。當然配置檔案也需要根據所選日誌框架而定。
四.框架衝突
- jcl-over-slf4j 與 slf4j-jcl 衝突
jcl-over-slf4j: commons-logging切換到slf4j
slf4j-jcl : slf4j切換到commons-logging
如果這兩者共存的話,必然造成相互委託,造成記憶體溢位 - log4j-over-slf4j 與 slf4j-log4j12 衝突
- jul-to-slf4j 與 slf4j-jdk14 衝突
- log4j-to-slf4j與slf4j-log4j12衝突