Log4j2转换第三方日志级别后为何无法过滤DEBUG日志?
问题分析与解决方案
问题根源
Log4j2的RewriteAppender执行逻辑是先执行自身配置的Filters,再应用日志级别重写规则,最后将日志转发给目标Appender。你的配置中,原始的INFO级别日志先被ThresholdFilter(级别为${env:LOGGING_LEVEL:-INFO})匹配,触发ACCEPT放行,之后才被重写成DEBUG级别——此时过滤器已经完成判断,重写后的DEBUG日志自然会被转发到stdout输出,这就是过滤器没生效的核心原因。
修正配置方案
把过滤逻辑从RewriteAppender移到目标的stdout Appender中,让重写后的日志级别被过滤器检查:
1. 保留AsyncLogger和RewriteAppender配置(移除Rewrite里的Filters块)
<AsyncLogger name="audit-events" level="${env:LOGGING_LEVEL:-INFO}" additivity="false"> <AppenderRef ref="stdout-rewrite-info-to-debug"/> </AsyncLogger>
<Rewrite name="stdout-rewrite-info-to-debug"> <AppenderRef ref="stdout"/> <LoggerNameLevelRewritePolicy logger="audit-events"> <KeyValuePair key="INFO" value="DEBUG"/> </LoggerNameLevelRewritePolicy> </Rewrite>
2. 给stdout Appender添加ThresholdFilter
假设你的stdout是Console类型Appender,修改如下:
<Console name="stdout" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> <Filters> <ThresholdFilter level="${env:LOGGING_LEVEL:-INFO}" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> </Console>
效果说明
- 当
LOGGING_LEVEL=INFO时:原始INFO日志被重写为DEBUG,到达stdout后,DEBUG级别低于INFO阈值,被ThresholdFilter拦截,不会输出到标准输出 - 当
LOGGING_LEVEL=DEBUG时:重写后的DEBUG级别符合阈值要求,日志正常输出到标准输出
内容的提问来源于stack exchange,提问作者Poorna
相关产品推荐
相关产品推荐

