Spring Boot 日誌各種使用姿勢,是時候捋清楚了!
阿新 • • 發佈:2020-12-16
@[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=