Log4j2配置:包级与类级日志过滤共存实现问题
解决Log4j2包级与类级日志过滤冲突问题
项目结构与日志需求
项目结构
com.app.package.one - class1.java - class2.java - class3.java - class4.java com.app.package.two - class5.java - class6.java - class7.java - class8.java
日志打印条件
- 条件1:所有类仅打印error级别日志;
- 条件2:日志语句包含
exception(不区分大小写)时才打印; - 条件3:
com.app.package.two.class7例外,包含exception或sometext(均不区分大小写)时均打印。
现有配置问题分析
原配置中,包级com.app.package的Logger使用RegexFilter拦截了所有不含exception的日志,而子类Logger(class7)默认会继承父级的Filter规则——也就是说,class7中含sometext的日志会先被父级的Filter DENY,根本到不了类级的Filter处理环节,所以无法满足条件3。
可行配置方案
通过设置类级Logger的additivity="false"属性,让其跳过父级Logger的Filter,同时分别配置父级与类级的过滤规则:
<!-- 包级Logger:满足条件1、2 --> <Logger name="com.app.package" level="error"> <RegexFilter regex=".*(?i)exception(?-i).*" onMatch="ACCEPT" onMismatch="DENY"/> </Logger> <!-- class7专属Logger:满足条件3,additivity="false"跳过父级Filter --> <Logger name="com.app.package.two.class7" level="error" additivity="false"> <RegexFilter regex=".*(?i)(exception|sometext)(?-i).*" onMatch="ACCEPT" onMismatch="DENY"/> </Logger> <!-- 需保留RootLogger配置,确保日志最终输出到目标Appender --> <Root level="error"> <AppenderRef ref="YourAppender"/> <!-- 替换为实际的Appender名称 --> </Root>
配置要点说明
additivity="false"的作用:关闭Logger的日志传递性,class7的日志不会再传递到父级com.app.package的Filter中,避免被提前拦截;- 正则优化:把两个匹配规则合并成一个
.*(?i)(exception|sometext)(?-i).*,简化配置; - 级别一致性:确保所有Logger的level都设置为
error,满足条件1。
效果验证
- 除
com.app.package.two.class7外的所有类:仅输出error级别且包含exception的日志; com.app.package.two.class7:输出error级别且包含exception或sometext的日志。
内容的提问来源于stack exchange,提问作者Mohan
相关产品推荐
相关产品推荐

