如何在Log4j2中配置同时匹配双条件的日志过滤规则
解决方案
Log4j2 原生支持通过调整过滤器的匹配返回值实现多条件与逻辑过滤,无需修改应用代码,仅调整log4j2.xml配置即可实现需求。
配置逻辑说明
你需要将两个过滤器按顺序组合,通过调整onMatch和onMismatch的返回值实现「同时满足两个条件才丢弃日志」的逻辑:
- 先匹配MDC规则:MDC不匹配时直接放行日志,MDC匹配时进入下一个正则规则校验
- 再匹配正则规则:正则匹配时丢弃日志,正则不匹配时放行日志
完整配置示例
<Filters> <!-- 第一步校验MDC:匹配则进入下一个过滤器,不匹配直接放行 --> <ThreadContextMapFilter onMatch="NEUTRAL" onMismatch="ACCEPT"> <KeyValuePair key="someValue" value="foo"/> </ThreadContextMapFilter> <!-- 第二步校验消息内容:匹配则丢弃,不匹配直接放行 --> <!-- 把regex属性的值替换为你要匹配的指定字符串即可,注意特殊字符转义 --> <RegexFilter regex=".*你要匹配的指定字符串.*" onMatch="DENY" onMismatch="ACCEPT"/> </Filters>
注:RegexFilter默认匹配整条日志消息内容,如果你需要区分匹配日志的其他字段(比如logger名、异常栈等),可以调整
useRawMsg等属性适配需求。
执行流程验证
- 日志无
someValue=foo的MDC键值对:直接返回ACCEPT,日志正常输出 - 日志有
someValue=foo的MDC键值对,但消息不包含指定字符串:返回ACCEPT,日志正常输出 - 日志有
someValue=foo的MDC键值对,且消息包含指定字符串:返回DENY,日志被丢弃
完全匹配你需要的双条件同时满足才丢弃的要求。
内容的提问来源于stack exchange,提问作者Joel Westberg
相关产品推荐
相关产品推荐

