log4j2 ThresholdFilter onMatch/onMismatch neutral/accept

  • onMatch vs onMismatch
    首先要说明的是,在log4j2里面日志有8个等级,由低到高是:all<trace<debug<info<warn<error<fatal<off

    • 看下面的配置,这个配置会输出error及以上的日志级别,也就是onMatch匹配的是 大于等于 该等级的日志,输出的就是error,fatal
    <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
    
    • 然后是一个相反的配置,这个配置会输出error以下的日志级别,也就是onMismatch匹配的是 小于 该等级的日志,输出的就是warn,info,debug,trace
    <ThresholdFilter level="error" onMatch="DENY" onMismatch="ACCEPT" />
    
  • neutral vs accept

    • 现在进入正题,继续看下面的一个配置,本来期待的是,这个配置对应的日志应该只输出warn等级的,结果却不是,居然把warn,info,debug和trace的等级都输出了,经过多次试验,无论怎么修改第二个过滤器,都是同样的结果,可以知道其实第二个过滤器是不起作用的。
    <ThresholdFilter level="error" onMatch="DENY" onMismatch="ACCEPT" />
    
    <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
    • 那么为了让第2个过滤器起作用,可以把上述配置修改如下,这个时候终于跟预期一样了,只输出了warn等级的日志。对比上下两个配置可以知道,其实只是把第一个过滤器的不匹配过滤策略字段从 ACCEPT修改为NEUTRAL 
    <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" />
    
    <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
    • 总结:由两个不同配置的日志的输出结果可以推论,当使用多个过滤器时,如果想要后面的过滤器起效,不能使用accept,而应该使用neutral,才能够把数据往过滤器链的下一环继续传递。
  • ThresholdFilter vs MarkerFilter

    • 对于这两种不同的过滤器,他们的区别其实就在与对于匹配策略的差异, ThresholdFilter的匹配策略已经在开头说了,是属于有层次的过滤。而对于MarkerFilter来说,对于层次不敏感,如果匹配,那么就输出对应这一个等级的日志,不会往上也不会往下递进输出。
    • 这里先来看java代码,marker这个过滤器使用的时候,是依附于logger的,至于是否能够独立使用,我个人不太清楚。
    Logger logger = LogManager.getLogger("mylog");
    
    Marker marker = MarkerManager.getMarker("FLOW");
    
    logger.trace("trace level");
    
    logger.debug(marker,"debug level");
    
    logger.info(marker,"info level");
    
    logger.warn(marker,"warn level");
    
    logger.error(marker,"error level");
    
    logger.fatal(marker,"fatal level");
    
    • 然后看对应的配置文件1,这里输出的结果是,只有trace的,
    <Filters>
    
    <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" />
    
    <MarkerFilter marker="FLOW" onMatch="DENY" onMismatch="ACCEPT" />
    
    </Filters>
    • 然后看对应的配置文件2,这里输出的结果是,warn,info,debug 3个
    <Filters>
    
    <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" />
    
    <MarkerFilter marker="FLOW" onMatch="ACCEPT" onMismatch="DENY" />
    
    </Filters>
    • 总结:包含有marker的就直接匹配,没有包含的就不匹配

总结
a)ThresholdFilter属性:onMatch表示匹配设定的日志级别后是DENY还是ACCEPT,onMismatch表示不匹配设定的日志级别是DENY还是ACCEPT还是NEUTRAL
b)上面说的match/misMatch指的是高于或等于设定的日志级别。所以,要先定义日志级别高的Filter。

onMatch和onMismatch都有三个属性值,分别为Accept、DENY和NEUTRAL

介绍一下这两个配置项的三个属性值:

onMatch="ACCEPT" 表示匹配该级别及以上
onMatch="DENY" 表示不匹配该级别及以上
onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
onMismatch="ACCEPT" 表示匹配该级别以下
onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
onMismatch="DENY" 表示不匹配该级别以下的

原文地址:log4j2 ThresholdFilter onMatch/onMismatch neutral/accept_AllenLeungX的博客-CSDN博客

LevelFilter是logback框架中的一个过滤器,用于根据精确的级别匹配过滤日志事件。它可以根据配置的级别来接受或拒绝事件。具体的操作取决于onMatchonMismatch属性的配置。如果事件的级别与配置的级别相匹配,则过滤器将根据onMatch属性的配置接受事件,否则根据onMismatch属性的配置拒绝事件。\[2\] 在logback的配置文件中,可以使用LevelFilter来过滤日志事件。通过设置level属性来指定过滤的级别,通过设置onMatchonMismatch属性来指定匹配和不匹配时的操作。比如,可以设置level为INFO,onMatchACCEPTonMismatch为DENY,这样当日志事件的级别为INFO时,过滤器将接受事件,否则拒绝事件。\[2\] 需要注意的是,过滤器的返回值是通过调用decide()方法来确定的。如果返回值为DENY,则日志事件将被放弃并且不会被剩余的过滤器考虑;如果返回值为NEUTRAL,则会经过下一个过滤器,如果没有其他过滤器,则日志事件会被正常处理;如果返回值为ACCEPT,则会立即处理日志,并且跳过后续的过滤器。\[3\] #### 引用[.reference_title] - *1* *2* *3* [Logback的Filters详解](https://blog.csdn.net/zeng6325998/article/details/106336878)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值