只输出单一级别,而不是本级及以上的级别日志。
直接上代码
eg: 只输出WARN
级别
<!--经测试,console标签里面也可以用,RollingFile没有测试,应该也可以-->
<File name="FileWarn" fileName="${FILE_PATH}/warn.log" append="false">
<Filters>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</File>
核心是:
<Filters>
内部去套多个<ThresholdFilter>
过滤器,外部的<Filters>
标签不能少,不能直接用多个<ThresholdFilter>
。网上很多资料就是没有说清楚这个,让人头疼。
原理:
<ThresholdFilter>
的 onMatch
:如何处理level及其以上级别的信息 ,onMismatch
则相应的,如何处理level以下的信息。因此要先定义日志级别高的Filter。
ACCEPT、DENY好理解,关键的就是NEUTRAL
:中立,不处理但也不拦截,交给后续过滤器处理。而DENY是直接拦截,后续有处理器也没办法处理。
因此要完成输出单一级别的任务:需要两个过滤器。还是以warn
级别为例
-
第一个过滤器,level为上一级别,此处即
level="ERROR"
,然后onMatch="DENY" onMismatch="NEUTRAL"
,效果等价于:(DENY)拦截ERROR及其以上的信息,放行ERROR以下的信息 -
第二个过滤器,level即为需要输出的级别,此处为
level="WARN"
,然后onMatch="ACCEPT" onMismatch="DENY"
,效果等价于:接收WARN及其以上级别的信息,拦截WARN以下级别的信息。但经第一个过滤器,此时WARN及其以上的级别的信息,只剩下WARN自己
至此,完成目标。
只要搞懂了原理,就算是想输出特定几个,或者某级别以下的,都是信手拈来。
拓:NEUTRAL的特例。
如果使用NEUTRAL的,已经是最后一个拦截器。那无论是onMatch还是onMismatch,都会匹配。
这里可能onMatch还容易理解,onMismatch都匹配是什么操作。但这是亲测出来的,是没错的。
笔者的理解:既然上面放行了,证明这些信息是有意义的,而到最后一个都还未处理,证明编程失误了,应该是要接收的。所以就统一接收了。
举个例子帮助理解:
<Filters>