我们通过下面的例子来理解 log4j 的 Loggers 配置是如何决定日志输出规则的。
<Loggers>
<Root level="debug">
<AppenderRef ref="consoleAppender" level="info"/>
<AppenderRef ref="allFileAppender" level="all"/>
<AppenderRef ref="debugFileAppender" level="debug"/>
<AppenderRef ref="infoFileAppender" level="info"/>
<AppenderRef ref="warnFileAppender" level="warn"/>
<AppenderRef ref="errorFileAppender" level="error"/>
Root>
<Logger level="trace" name="com.ruoyi.admin.log">
<AppenderRef ref="allFileAppender" level="all"/>
Logger>
Loggers>
这个配置结合了根 Logger 和自定义 Logger,并实现了分模块、分级别的日志记录策略。理解关键在于层级关系、继承机制和级别过滤的相互作用。
com.ruoyi.admin.log
及其子包的日志优先使用自定义 Logger 配置。即有子类的情况优先采用子类定义的规则。这点可以类比 Java 中的父类与子类关系。true
(即日志会同时传递给自定义 Logger 和根 Logger)com.ruoyi.admin.log
包日志)Appender | 输出内容 | 实际输出级别范围 |
---|---|---|
consoleAppender |
所有包的INFO+日志 | INFO, WARN, ERROR, FATAL |
allFileAppender |
所有包的DEBUG+日志(不包含TRACE) | DEBUG, INFO, WARN, ERROR |
debugFileAppender |
所有包的DEBUG+日志 | DEBUG, INFO, WARN, ERROR |
infoFileAppender |
所有包的INFO+日志 | INFO, WARN, ERROR, FATAL |
warnFileAppender |
所有包的WARN+日志 | WARN, ERROR, FATAL |
errorFileAppender |
所有包的ERROR+日志 | ERROR, FATAL |
注意:根Logger的
level="debug"
过滤掉了TRACE日志,因此allFileAppender
也捕获不到TRACE
com.ruoyi.admin.log
包)Appender | 输出内容 | 实际输出级别范围 |
---|---|---|
allFileAppender |
com.ruoyi.admin.log 包的TRACE+日志 |
TRACE, DEBUG, INFO, WARN, ERROR |
com.ruoyi.admin.log
包的日志由于additivity=true
(默认),该包的日志会同时被:
DEBUG日志 → 通过trace级别 → allFileAppender(level=all) → 输出
DEBUG日志 → 通过debug级别 → 根Logger的Appender二次过滤:
allFileAppender(level=all) → 输出
debugFileAppender(level=debug) → 输出
infoFileAppender(level=info) → 丢弃
allFileAppender 会记录两次 com.ruoyi.admin.log
的DEBUG日志,表现为 allFileAppender 指定的日志输出文件中会打印两次相同的日志。
增加additivity="false"
属性:
<Logger level="trace" name="com.ruoyi.admin.log" additivity="false">
<AppenderRef ref="allFileAppender" level="all"/>
Logger>
优化后效果:
日志来源 | allFileAppender | 其他Appender |
---|---|---|
非com.ruoyi.admin.log |
根Logger的DEBUG+日志 | 按各自级别过滤 |
com.ruoyi.admin.log |
该包的TRACE+日志 | 不再出现 |
即只有 allFileAppender 能输出 com.runyi.admin.log 及其子包中的日志。
Appender | 输出内容 | 覆盖范围 |
---|---|---|
consoleAppender |
全局INFO+日志(不含特殊包) | 非特殊包 |
allFileAppender |
全局DEBUG+日志 + 特殊包TRACE+日志 | 所有包,不同级别 |
debugFileAppender |
全局DEBUG+日志(不含特殊包) | 非特殊包 |
infoFileAppender |
全局INFO+日志(不含特殊包) | 非特殊包 |
warnFileAppender |
全局WARN+日志(不含特殊包) | 非特殊包 |
errorFileAppender |
全局ERROR+日志(不含特殊包) | 非特殊包 |
特殊包:
com.ruoyi.admin.log
及其子包
这种配置实现了: