下一個項目為什么要用 SLF4J


阿里巴巴 Java 開發手冊

前幾天阿里巴巴在雲棲社區首次公開阿里官方Java代碼規范標准,就是一個PDF手冊,有命名規范,讓你知道自己原來取的每一個類名、變量名都是爛名字,真替你家未來孩子擔心;有集合處理、並發處理、OOM/NPE 異常、魔法值等等好多規范,什么?你不知道什么是魔法值,算了,我也是第一次聽說:即未經定義的常量;還有一個關於 Map 遍歷的推薦,這個大家應該都知道,推薦使用 entrySet 遍歷 Map 類集合 KV,而不是 keySet 方式進行遍歷。 因為 keySet 是遍歷了 2 次,而 entrySet 只是遍歷了一次就把 key 和 value 都放到了 entry 中,效
率更高。還有接口類中的方法和屬性不要加任何修飾符號(public 也不要加)這些推薦做法,這些都沒什么,日常開發中應該做到的規范,但下面這個【強制】,我發現我接觸的項目都沒做到。

【強制】應用中不可直接使用日志系統(Log4j、Logback)中的 API

在手冊中的日志規約中,看到有一條這樣的規定,說實話我有點懵逼, Log4j 不是 Java 中應用最廣的日志系統么?為啥不讓用?

【強制】應用中不可直接使用日志系統(Log4j、Logback)中的API,而應依賴使用日志框架
SLF4J中的API,使用門面模式的日志框架,有利於維護和各個類的日志處理方式統一。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Abc.class);

在這段規約中看到了推薦使用 SLF4J 這個日志框架,而且還是毫不由分說的【強制】,那它到底好在什么地方?

SLF4J,即簡單日志門面(Simple Logging Facade for Java),不是具體的日志解決方案,它只服務於各種各樣的日志系統。按照官方的說法,SLF4J是一個用於日志系統的簡單Facade,允許最終用戶在部署其應用時使用其所希望的日志系統。
來自百科里的描述

大概意思就是說 SLF4J 是一個日志抽象層,允許你使用任何一個日志系統,並且可以隨時切換還不需要動到已經寫好的程序(我特么是真改過整個項目的所有打印日志的代碼,累死...),這對於第三方組件的引入的不同日志系統來說幾乎零學習成本了,況且它的優點不僅僅這一個而已,還有簡潔的占位符的使用和日志級別的判斷,眾所周知的日志讀寫一定會影響系統的性能,但這些特性都是對系統性能友好的。官網地址:https://www.slf4j.org/

少廢話,你來測試一下

說了辣么多,下面我就將建立一個項目,是 Maven 項目哦,並用 SLF4J 來結合 JDK14、Simple、Logback、Log4j 做日志系統,在上述幾個日志系統間隨意切換,而且不修改一行代碼,甚至不用修改一個字符。

1.首先建立一個簡單的 Java 項目(Maven Project),目錄結構如下:

SLF4J_ProjectTree.png

2.在 pom.xml 中增加 SLF4J API 依賴包
使用的目前最新穩定版 1.7.22 的 SLF4J:

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

jar 包: slf4j-api-1.7.22.jar
接着並在測試項目中的 App.java 中加入日志輸出代碼,代碼如下:

package xyz.mafly.SLF4JTest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Hello world!
 *
*/
public class App {

	final Logger logger = LoggerFactory.getLogger(App.class);

	private void test() {
		logger.info("這是一條日志信息 - {}", "mafly");
	}

	public static void main(String[] args) {
		App app = new App();
		app.test();
		
		System.out.println("Hello World!");
	}
}

到這里,代碼就寫完了、寫完了。以后無論在 Log4j 還是 Logback 日志系統切換,都不需要修改這里的代碼!一個字符都不需要!!

3. JDK14 日志系統,slf4j-jdk14
pom.xml 中增加 slf4j-jdk14 依賴包:

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

jar 包: slf4j-jdk14-1.7.22.jar
運行程序,即可看到如下圖輸出:

slf4j_jdk14.png

4. Simple 日志系統,slf4j-simple
pom.xml 中注釋掉 JDK14 包節點,增加 slf4j-simple 依賴包:

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

jar 包: slf4j-simple-1.7.22.jar
運行程序,即可看到如下圖不同輸出:

slf4j_simple.png

5. Log4j 日志系統(最常用), slf4j-log4j
依然是在 pom.xml 中注釋掉 Simple 包節點,增加 slf4j-log4j12 依賴包:

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

jar 包: slf4j-log4j12-1.7.22.jarlog4j-1.2.17.jar

Log4j 除了導入 jar 包后,還需要增加一下日志格式的配置文件,我新增了一個log4j.properties的日志配置文件,具體 Log4j 詳細配置我之前在 《log4j 項目中的詳細配置》 這篇博客中寫過。運行程序,即可看到如下圖輸出(輸出格式可自己配置):

slf4j_log4j.png

6. Logback 日志系統, slf4j-logback
pom.xml 中注釋掉 Log4j 包節點,增加 slf4j-logback 依賴包:

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

jar 包: logback-core-1.1.9.jarlogback-classic-1.1.9.jar
運行程序,也可看到如下圖日志輸出:

slf4j_logback.png

總結一下

看完阿里巴巴的這個開發手冊,的確學到了一些新知識和規范,SLF4J 只是其中一個知識點而已。
說回 SLF4J 這個日志框架,在下一個開源項目或內部類庫中都強烈推薦使用 SLF4J ,它的好處不言而喻,這也是阿里巴巴強制使用的原因所在。希望這篇文章對你的項目中日志系統有所幫助,任何一個任何編程語言的開發者,都應該重視日志的重要性和編碼規范,對你、團隊和未來閱讀你代碼的人都好,相信我,他們肯定會感激你的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM