前言
代码运行日志对于项目来说十分重要。本文记录的是 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
- ...
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: application
# 管道
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/%d{yyyy-MM-dd}-%i-${projectName}.log
patternLayout:
pattern: "%d{DEFAULT} %5level %pid --- %c : %msg%n"
policies:
sizeBasedTriggeringPolicy:
size: 20 MB
timeBasedTriggeringPolicy:
interval: 1
defaultRolloverStrategy:
max: 30
filters:
thresholdFilter:
# 日志级别 >= warn
level: warn
onMatch: accept
onMismatch: deny
# 路由
loggers:
root:
# 日志级别 >= info
level: info
appenderRef:
- ref: console
- ref: rollingFile
详细版
configuration:
name: log4j2YamlConfig
status: error
# 属性
properties:
property:
- name: level
value: info
- name: projectName
value: application
- name: rollingFile.policies.sizeBasedTriggeringPolicy.size
value: 20 MB
- name: rollingFile.policies.timeBasedTriggeringPolicy.interval
value: 1
- name: rollingFile.defaultRolloverStrategy
value: 30
- name: rollingFile.fileName
value: log/${projectName}
- name: rollingFile.filePattern
value: log/backup/%d{yyyy-MM-dd}-%i-${projectName}
- name: rollingFile.patternLayout.pattern
value: "%d{DEFAULT} %5level %pid --- %c : %msg%n"
# 管道
appenders:
# 控制台
console:
name: console
patternLayout:
pattern: "%d{DEFAULT} %highlight{%5level} %pid --- %highlight{%c}{STYLE=Logback} : %msg%n"
# 滚动文件
rollingFile:
- name: debugRollingFile
fileName: ${rollingFile.fileName}-debug.log
filePattern: ${rollingFile.filePattern}-debug.log
patternLayout:
pattern: ${rollingFile.patternLayout.pattern}
policies:
sizeBasedTriggeringPolicy:
size: ${rollingFile.policies.sizeBasedTriggeringPolicy.size}
timeBasedTriggeringPolicy:
interval: ${rollingFile.policies.timeBasedTriggeringPolicy.interval}
defaultRolloverStrategy:
max: ${rollingFile.defaultRolloverStrategy}
filters:
# 只接收 debug 级别日志
thresholdFilter:
- level: info
onMatch: deny
onMismatch: neutral
- level: debug
onMatch: accept
onMismatch: deny
- name: infoRollingFile
fileName: ${rollingFile.fileName}-info.log
filePattern: ${rollingFile.filePattern}-info.log
patternLayout:
pattern: ${rollingFile.patternLayout.pattern}
policies:
sizeBasedTriggeringPolicy:
size: ${rollingFile.policies.sizeBasedTriggeringPolicy.size}
timeBasedTriggeringPolicy:
interval: ${rollingFile.policies.timeBasedTriggeringPolicy.interval}
defaultRolloverStrategy:
max: ${rollingFile.defaultRolloverStrategy}
filters:
# 只接收 info 级别日志
thresholdFilter:
- level: warn
onMatch: deny
onMismatch: neutral
- level: info
onMatch: accept
onMismatch: deny
- name: warnRollingFile
fileName: ${rollingFile.fileName}-warn.log
filePattern: ${rollingFile.filePattern}-warn.log
patternLayout:
pattern: ${rollingFile.patternLayout.pattern}
policies:
sizeBasedTriggeringPolicy:
size: ${rollingFile.policies.sizeBasedTriggeringPolicy.size}
timeBasedTriggeringPolicy:
interval: ${rollingFile.policies.timeBasedTriggeringPolicy.interval}
defaultRolloverStrategy:
max: ${rollingFile.defaultRolloverStrategy}
filters:
# 只接收 warn 级别日志
thresholdFilter:
- level: error
onMatch: deny
onMismatch: neutral
- level: warn
onMatch: accept
onMismatch: deny
- name: errorRollingFile
fileName: ${rollingFile.fileName}-error.log
filePattern: ${rollingFile.filePattern}-error.log
patternLayout:
pattern: ${rollingFile.patternLayout.pattern}
policies:
sizeBasedTriggeringPolicy:
size: ${rollingFile.policies.sizeBasedTriggeringPolicy.size}
timeBasedTriggeringPolicy:
interval: ${rollingFile.policies.timeBasedTriggeringPolicy.interval}
defaultRolloverStrategy:
max: ${rollingFile.defaultRolloverStrategy}
filters:
# 只接收 error 级别日志
thresholdFilter:
- level: error
onMatch: accept
onMismatch: deny
# 路由
loggers:
root:
level: ${level}
appenderRef:
- ref: console
- ref: debugRollingFile
- ref: infoRollingFile
- ref: warnRollingFile
- ref: errorRollingFile
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。