-
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博客