为何仅需INFO级日志时,DEBUG和TRACE日志仍输出至控制台?
问题原因分析
你遇到的问题核心在于Log4j2的**日志传递性(additivity)**设置。
在你的配置里,<Logger name="org.example" level="ALL" additivity="true"> 中的additivity="true"是关键——这个属性默认是true,意味着当前Logger捕获的所有日志(这里是ALL级别,包含DEBUG、TRACE)会向上传递给父Logger(也就是Root Logger)。
而你的Root Logger配置了Console Appender,虽然Root的级别是INFO,但传递过来的日志不会再被Root的级别过滤(因为子Logger已经完成了级别过滤),所以这些DEBUG、TRACE日志会被Root的Console Appender输出到控制台,导致你看到所有级别日志都出现在控制台。
修复方案
只需要把org.example Logger的additivity属性设置为false,阻止日志向上传递给Root Logger即可:
<Logger name="org.example" level="ALL" additivity="false"> <AppenderRef ref="RollingFile" level="ALL" /> </Logger>
补充说明
- 当
additivity="false"时,org.exampleLogger的日志只会被配置的RollingFileAppender处理,不会再传递给父Logger; - Root Logger会独立处理其他未被子Logger捕获的日志(级别
INFO及以上),并输出到Console; - 这样就能实现你的需求:控制台仅显示INFO及以上级别,DEBUG/TRACE仅输出到文件。
验证一下修改后的效果:
- 控制台只会输出
INFO : Hello info; - 文件里会保留所有级别的日志。
内容的提问来源于stack exchange,提问作者User1751
相关产品推荐
相关产品推荐

