
前言
代碼運行日志對于項目來說十分重要。本文記錄的是 SpringBoot 與 Log4j2 的整合配置過程,至于其他日志框架和 Log4j2 的對比,小伙伴們可自行查閱資料。
環(huán)境
- JDK 8
- Gradle 6.7
準(zhǔn)備
排除 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 級別無法使用。可閱讀文章 為什么阿里巴巴禁止工程師直接使用日志系統(tǒng)(Log4j、Logback)中的 API 了解日志門面相關(guān)知識。
配置文件結(jié)構(gòu)
- Appenders
- Appender
- Layout
- Filter
- Policy
- Strategy
- ...
- Appender
- Loggers
- Logger
- RootLogger
Appender
可以理解為「管道」,控制日志保存的位置。下面的其它配置參數(shù)都是以 rollingFileAppender 為例。
其他 Appender 相關(guān)文檔可參考:Log4j2 官方文檔 Appender 部分。
Layout
| 參數(shù) | 說明 |
|---|---|
| %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 參數(shù)。
其他 Layout 相關(guān)文檔可參考:Log4j2 官方文檔 Layout 部分。
Filter
控制日志能否進入管道,示例中采用 thresholdFilter。
appenders:
rollingFile:
filters:
thresholdFilter:
# 匹配的級別 >= info
level: info
onMatch: accept
onMismatch: neutral
Filter 也可以在 Loggers 層級里配置,詳細內(nèi)容請自行參考文檔。
其他 Filter 相關(guān)文檔可參考:Log4j2 官方文檔 Filter 部分。
Policy
控制日志何時(when)進行歸檔。示例中采用 sizeBasedTriggeringPolicy 和 timeBasedTriggeringPolicy。
appenders:
rollingFile:
# 日志歸檔文件名模板
filePattern: log/backup/$${date:yyyy-MM}/%d{yyyy-MM-dd}_${projectName}_%i.log
policies:
# 日志文件到達 20 MB 時觸發(fā)
sizeBasedTriggeringPolicy:
size: 20 MB
# 以天為單位歸檔日志
timeBasedTriggeringPolicy:
interval: 1
注意 filePattern 中最小的時間單位是「天」,所以 timeBasedTriggeringPolicy.interval = 1 時,日志將以「天」為單位進行歸檔。
其他 Policy 相關(guān)文檔可參考:Log4j2 官方文檔 Policy 部分。
Strategy
控制日志如何(How)進行歸檔。示例中采用 defaultRolloverStrategy。
appenders:
rollingFile:
defaultRolloverStrategy:
max: 100
與上面的 Policy 配合,可以實現(xiàn)每天最多生成 100 個日志文件,如果單個日志文件體積已經(jīng)超過 20 MB,就重新生成新的日志文件,并將該日志文件歸檔處理。單日最多可生成 100 個,由 max 參數(shù)控制。
其他 Strategy 相關(guān)文檔可參考:Log4j2 官方文檔 Strategy 部分。
Logger
Logger 可以理解成路由器,用來指定類或包中產(chǎn)生的日志信息進入哪個管道。
- RootLogger(必須配置)
- Logger
其它 Logger 相關(guān)文檔可參考:Log4j2 官方文檔 Logger 部分。
總結(jié)
這里貼出一份較為完整的配置方案,供小伙伴們參考。主要實現(xiàn)了以下兩點功能:
- 控制臺打印彩色日志。
- 以天為單位進行日志文件歸檔。
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