前言
程式碼執行日誌對於專案來說十分重要。本文記錄的是 SpringBoot 與 Log4j2 的整合配置過程,至於其他日誌框架和 Log4j2 的對比,小夥伴們可自行查閱資料。
環境
- JDK 8
- Gradle 6.7
準備
排除 Logback 依賴
先排除 SpringBoot 預設使用的 Logback 日誌框架,在 build.gradle
裡新增下面的配置。
configurations {
implementation.exclude module: 'spring-boot-starter-logging'
}
引入 Log4j2 依賴
我們採用 Log4j2 支援的 YAML 格式配置檔案,支援該格式需要加入 jackson-dataformat-yaml
依賴,詳情可查閱文件。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml'
}
瞭解
日誌等級
Standard Level | Int Level |
---|---|
OFF | 0 |
FATAL | 100 |
ERROR | 200 |
WARN | 300 |
INFO | 400 |
DEBUG | 500 |
TRACE | 600 |
ALL | Integer.MAX_VALUE |
級別從低到高分別是:ALL
、TRACE
、DEBUG
、INFO
、WARN
、ERROR
、FATAL
、OFF
但由於我們使用的是 Slf4j
門面,所以 ALL
、FATAL
和 OFF
級別無法使用。可閱讀文章 為什麼阿里巴巴禁止工程師直接使用日誌系統(Log4j、Logback)中的 API 瞭解日誌門面相關知識。
配置檔案結構
- Appenders
- Appender
- Layout
- Filter
- Policy
- Strategy
- …
- Appender
- Loggers
- Logger
- RootLogger
Appender
可以理解為「管道」,控制日誌儲存的位置。下面的其它配置引數都是以 rollingFileAppender
為例。
其他 Appender 相關文件可參考:Log4j2 官方文件 Appender 部分。
Layout
引數 | 說明 |
---|---|
%d | 日誌時間 |
%level | 日誌級別 |
%pid | 程式 ID |
%t | 執行緒名 |
%c | Logger 名稱 |
%msg | 日誌文字 |
%n | 換行符 |
%highlight | 顏色高亮 |
控制日誌格式,一般採用 patternLayout
。
appenders:
rollingFile:
patternLayout:
# 日誌格式模板
pattern: "%d{DEFAULT} %5level %pid --- %c : %msg%n"
如果想在「控制檯」中列印出有顏色的日誌資訊,可加入 consoleAppender
後在 pattern
欄位中加入 %highlight
引數。
其他 Layout 相關文件可參考:Log4j2 官方文件 Layout 部分。
Filter
控制日誌能否進入管道,示例中採用 thresholdFilter
。
appenders:
rollingFile:
filters:
thresholdFilter:
# 匹配的級別 >= info
level: info
onMatch: accept
onMismatch: neutral
Filter 也可以在 Loggers 層級裡配置,詳細內容請自行參考文件。
其他 Filter 相關文件可參考:Log4j2 官方文件 Filter 部分。
Policy
控制日誌何時(when)進行歸檔。示例中採用 sizeBasedTriggeringPolicy
和 timeBasedTriggeringPolicy
。
appenders:
rollingFile:
# 日誌歸檔檔名模板
filePattern: log/backup/$${date:yyyy-MM}/%d{yyyy-MM-dd}_${projectName}_%i.log
policies:
# 日誌檔案到達 20 MB 時觸發
sizeBasedTriggeringPolicy:
size: 20 MB
# 以天為單位歸檔日誌
timeBasedTriggeringPolicy:
interval: 1
注意 filePattern
中最小的時間單位是「天」,所以 timeBasedTriggeringPolicy.interval = 1
時,日誌將以「天」為單位進行歸檔。
其他 Policy 相關文件可參考:Log4j2 官方文件 Policy 部分。
Strategy
控制日誌如何(How)進行歸檔。示例中採用 defaultRolloverStrategy
。
appenders:
rollingFile:
defaultRolloverStrategy:
max: 100
與上面的 Policy 配合,可以實現每天最多生成 100 個日誌檔案,如果單個日誌檔案體積已經超過 20 MB,就重新生成新的日誌檔案,並將該日誌檔案歸檔處理。單日最多可生成 100 個,由 max
引數控制。
其他 Strategy 相關文件可參考:Log4j2 官方文件 Strategy 部分。
Logger
Logger 可以理解成路由器,用來指定類或包中產生的日誌資訊進入哪個管道。
- RootLogger(必須配置)
- Logger
其它 Logger 相關文件可參考:Log4j2 官方文件 Logger 部分。
總結
這裡貼出一份較為完整的配置方案,供小夥伴們參考。主要實現了以下兩點功能:
- 控制檯列印彩色日誌。
- 以天為單位進行日誌檔案歸檔。
configuration:
name: log4j2YamlConfig
status: error
# 屬性
properties:
property:
name: projectName
value: demo
# 管道
appenders:
# 控制檯
console:
name: console
patternLayout:
pattern: "%d{DEFAULT} %highlight{%5level} %pid --- %highlight{%c}{STYLE=Logback} : %msg%n"
# 滾動檔案
rollingFile:
name: rollingFile
fileName: log/${projectName}.log
filePattern: log/backup/$${date:yyyy-MM}/%d{yyyy-MM-dd}_${projectName}_%i.log
patternLayout:
pattern: "%d{DEFAULT} %5level %pid --- %c : %msg%n"
policies:
sizeBasedTriggeringPolicy:
size: 20 MB
timeBasedTriggeringPolicy:
interval: 1
defaultRolloverStrategy:
max: 100
filters:
thresholdFilter:
# 日誌級別 >= error
level: error
onMatch: accept
onMismatch: deny
# 路由
loggers:
root:
# 日誌級別 >= info
level: info
appenderRef:
- ref: console
- ref: rollingFile
本作品採用《CC 協議》,轉載必須註明作者和本文連結