1. 程式人生 > >Spring Boot 日誌各種使用姿勢,是時候捋清楚了!

Spring Boot 日誌各種使用姿勢,是時候捋清楚了!

@[toc] 之前錄過一個視訊和大家分享 Spring Boot 日誌問題,但是總感覺差點意思,因此鬆哥打算再通過一篇文章來和大家捋一捋 Java 中的日誌問題,順便我們把 Spring Boot 中的日誌問題也說清楚。 ## 1. Java 日誌概覽 說到 Java 日誌,很多初學者可能都比較懵,因為這裡涉及到太多東西了:`Apache Commons Logging`、`Slf4j`、`Log4j`、`Log4j2`、`Logback`、`Java Util Logging` 等等,這些框架各自有什麼作用?他們之間有什麼區別? ### 1.1 總體概覽 下面這張圖很好的展示了 Java 中的日誌體系: ![](https://img-blog.csdnimg.cn/img_convert/46f9eb50dfa3e14a5a7f58cf9dfb7301.png) 可以看到,Java 中的日誌框架主要分為兩大類:**日誌門面**和**日誌實現**。 **日誌門面** 日誌門面定義了一組日誌的介面規範,它並不提供底層具體的實現邏輯。`Apache Commons Logging` 和 `Slf4j` 就屬於這一類。 **日誌實現** 日誌實現則是日誌具體的實現,包括日誌級別控制、日誌列印格式、日誌輸出形式(輸出到資料庫、輸出到檔案、輸出到控制檯等)。`Log4j`、`Log4j2`、`Logback` 以及 `Java Util Logging` 則屬於這一類。 將日誌門面和日誌實現分離其實是一種典型的門面模式,這種方式可以讓具體業務在不同的日誌實現框架之間自由切換,而不需要改動任何程式碼,開發者只需要掌握日誌門面的 API 即可。 日誌門面是不能單獨使用的,它必須和一種具體的日誌實現框架相結合使用。 那麼日誌框架是否可以單獨使用呢? 技術上來說當然沒問題,但是我們一般不會這樣做,因為這樣做可維護性很差,而且後期擴充套件不易。例如 A 開發了一個工具包使用 Log4j 列印日誌,B 引用了這個工具包,但是 B 喜歡使用 Logback 列印日誌,此時就會出現一個業務使用兩個甚至多個日誌框架,開發者也需要維護多個日誌的配置檔案。因此我們都是用日誌門面列印日誌。 ### 1.2 日誌級別 使用日誌級別的好處在於,調整級別,就可以遮蔽掉很多除錯相關的日誌輸出。不同的日誌實現定義的日誌級別不太一樣,不過也都大同小異。 **Java Util Logging** `Java Util Logging` 定義了 7 個日誌級別,從嚴重到普通依次是: - SEVERE - WARNING - INFO - CONFIG - FINE - FINER - FINEST 因為預設級別是 INFO,因此 INFO 級別以下的日誌,不會被打印出來。 **Log4j** `Log4j` 定義了 8 個日誌級別(除去 OFF 和 ALL,可以說分為 6 個級別),從嚴重到普通依次是: - OFF:最高等級的,用於關閉所有日誌記錄。 - FATAL:重大錯誤,這種級別可以直接停止程式了。 - ERROR:列印錯誤和異常資訊,如果不想輸出太多的日誌,可以使用這個級別。 - WARN:警告提示。 - INFO:用於生產環境中輸出程式執行的一些重要資訊,不能濫用。 - DEBUG:用於開發過程中列印一些執行資訊。 - TRACE - ALL 最低等級的,用於開啟所有日誌記錄。 **Logback** `Logback` 日誌級別比較簡單,從嚴重到普通依次是: - ERROR - WARN - INFO - DEBUG - TRACE ### 1.3 綜合對比 `Java Util Logging` 系統在 `JVM` 啟動時讀取配置檔案並完成初始化,一旦應用程式開始執行,就無法修改配置。另外,這種日誌實現配置也不太方便,只能在 `JVM` 啟動時傳遞引數,像下面這樣: ```java -Djava.util.logging.config.file=