前言
之前使用 SpringBoot 的時候,總是習慣於將日志框架切換為 Log4j2,可能是覺得比較靠譜,也可能年齡大了比較排斥新東西。今天搞新項目的時候,想着每次搞這個遷移有點兒麻煩,就想着看看 Logback 這個 SpringBoot 一直默認集成(推薦)使用的框架具體是個什么樣子,參考Spring 官方文檔日志章節實踐下來感覺不錯,翻譯和補充一下關鍵知識點。
注:本文僅涉及 SpringBoot 和 Logback 集成使用的相關內容,關於 Logback 的詳細內容請自行參考官網。
日志格式
以 SpringBoot 應用啟動的一行日志為例:
2021-12-08 10:21:45.585 INFO 28453 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
日志由以下 8 個部分組成:
-
日期時間,精確到毫秒
2021-12-08 10:21:45.585
-
日志級別
INFO
Logback 的日志級別:ERROR、WARN、INFO、DEBUG 和 TRACE。注意,Logback 不支持 FATAL,會映射給 ERROR。
-
進程ID
28453
Java(SpringBoot)應用進程ID。
-
分隔線
---
僅作為日志頭(1、2、3)和日志體(5、6、7)之間的分隔線,無實際意義。
-
線程名稱
[ main]
方括號([])內部的字符串即為線程名稱。
-
記錄器名稱
o.s.b.w.embedded.tomcat.TomcatWebServer
日志記錄器(logger)名稱,一般使用類名代替。
-
冒號
:
僅作為日志記錄器(6)和日志消息(7)之間的分隔符,無實際意義。
-
日志消息
Tomcat initialized with port(s): 8080 (http)
日志消息內容。
日志輸出
默認情況下,SpringBoot 僅會輸出日志至控制台(Console),如果需要輸出至日志文件,需要通過配置屬性 logging.file.name 或 logging.file.path 開啟日志文件輸出功能。
兩個配置屬性二選一即可,本文以 logging.file.name 為例:
logging:
file:
name: /tmp/boot.log
日志輸出至控制台的同時,也會輸出至日志文件 /tmp/boot.log,該日志文件大小達到 10 MB 時,會發生日志輪替:
boot.log
boot.log.2021-12-08.0.gz
boot.log.2021-12-08.1.gz
boot.log.2021-12-08.2.gz
boot.log.2021-12-08.3.gz
日志會以 天(日期,如:2021-12-08)為單位進行歸檔壓縮(GZ 格式),考慮到該 天 內可能會有多個歸檔文件,歸檔壓縮文件名稱中會包含有序號(如:0、1、2、3)。
日志輪替
我們也可以通過配置屬性自定義日志輪替過程:
logging:
file:
name: /tmp/boot.log
logback:
rollingpolicy:
file-name-pattern: /tmp/boot-%d{yyyy-MM-dd}.%i.log
clean-history-on-start: false
max-file-size: 1GB
total-size-cap: 10GB
max-history: 7
日志輪替底層使用的是 Logback SizeAndTimeBasedRollingPolicy,同時支持按照 日志時間 和 日志大小 進行歸檔。
-
logging.logback.rollingpolicy.file-name-pattern
歸檔文件名稱模式,即:按照什么樣的規則生成歸檔文件名稱,文件名稱中可以包含時間和序號。
時間,表示按日志時間歸檔,使用 %d{...} 用於指定具體的日期時間格式(Java SimpleDateFormat), yyyy-MM-dd 表示按天(日期)歸檔(按日志時間歸檔);
序號,表示同一個歸檔時間下,因日志大小達到閾值,日志歸檔多次產生多個歸檔文件的序號;boot.log boot-2021-12-08.0.log boot-2021-12-08.1.log boot-2021-12-08.2.log boot-2021-12-08.3.log ......
-
logging.logback.rollingpolicy.max-file-size
日志文件大小最大值,使用 KB/MB/GB/... 為單位進行指定;日志文件大小超過設置的最大值,會進行日志歸檔(按日志大小歸檔)。
-
logging.logback.rollingpolicy.total-size-cap
日志文件(日志文件 + 歸檔文件)總大小,使用 KB/MB/GB/... 為單位進行指定;日志文件總大小超過設置的值,會刪除老(舊)的歸檔文件,直到日志文件總大小小於設置的值。
-
logging.logback.rollingpolicy.max-history
歸檔日志文件保留天數,歸檔時間超出保留天數范圍的歸檔文件會被刪除。
-
logging.logback.rollingpolicy.clean-history-on-start
歸檔文件的刪除是在日志輸出過程中執行的,這個屬性可以指定應用啟動時是否執行一次歸檔文檔(因日志時間或大小)的刪除,true 為執行,false 為不執行。
日志級別
日志記錄器(logger)是有層次結構的,我們可以為不同的層次的記錄器指定不同的日志輸出級別。
指定根(root)記錄器日志輸出級別:
logging:
level:
root: info
如前文所述,日志記錄器的名稱通常是類名,我們可以認為日志記錄器的層次結構是按照類名結構設計的:
父包名 + 若干子包名 + 類名
以 com.aopeila.meetu.boot.api.Main 為例,我們可以按照如下方式分別指定不同層次日志記錄器的輸出級別:
logging:
level:
com: debug
com.aopeila: info
com.aopeila.meetu: warn
com.aopeila.meetu.boot.api.Main: error
日志記錄器會按 最長前綴匹配 計算日志應使用的輸出級別,如果沒有匹配到,則使用根記錄器的日志輸出級別。
日志分組
我們可以把相關的一些日志記錄器(logger)合並為一個分組(group),然后以分組為單位進行配置。
比如,可以把所有 Tomcat 相關的日志記錄器合並為一個分組:
logging:
group:
tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"
我們把以下日志記錄器:
org.apache.catalina
org.apache.coyote
org.apache.tomcat
合並為一個分組 tomcat。
然后就可以使用分組 tomcat 進行日志屬性的配置,如統一設置日志級別:
logging:
level:
tomcat: "trace"
將分組 tomcat 日志級別設置為 trace,也就是將前面提到的三個日志記錄器的日志級別設置為 trace。
小結
SpringBoot 默認集成 Logback 提供的日志功能,應該可以滿足我們日常大部分需求場景,配置也比較簡單,推薦大家在實際項目中使用。