log4j2.xml

2,864 阅读3分钟
  1. 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" />
    
  2. 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,才能够把数据往过滤器链的下一环继续传递。
  3. 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的就直接匹配,没有包含的就不匹配

参考链接:neutral vs accpet