log4j的阈值过滤器中的ACCEPT vs NEUTRAL

时间:2017-08-17 05:04:08

标签: log4j2

如果我在log4j xml文件中使用简单的阈值过滤器,这只是意味着从过滤器级别开始记录所有内容。所以

<ThresholdFilter level="INFO" onMatch="NEUTRAL"/>

记录INFO,WARNING,ERROR和FATAL。所以NEUTRAL这是默认值的接缝意味着:不要过滤掉任何内容并让日志通过。

如果我将其更改为

<ThresholdFilter level="INFO" onMatch="ACCEPT"/>

该怎么办?

3 个答案:

答案 0 :(得分:5)

首先我想在回答你的问题之前提一个项目。你写道:

  

记录INFO,WARNING,ERROR和FATAL。所以它接缝中性,哪个   是默认值,表示:不过滤掉任何内容并让日志   经历。

由于过滤器的onMismatch参数的默认值过滤掉了TRACE和DEBUG级别事件,因此不完全准确。根据{{​​3}}:

  

onMismatch [是]过滤器不匹配时要采取的操作。可能是接受,拒绝或中立。 默认值为DENY。

回到你的问题,使用单个过滤器时NEUTRALACCEPT之间的区别是什么,它们的行为相同。但是,当您使用ThresholdFilter documentation时,会产生巨大的差异。

假设我有一个生成一些日志的简单类:

package example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;

public class SomeClass {

    private static final Logger log = LogManager.getLogger();
    private static final Marker FLOW_MARKER = MarkerManager.getMarker("FLOW");

    public static void main(String[] args){

        if(log.isDebugEnabled())
            log.debug(FLOW_MARKER,"This is some debug!");

        log.info("Here's some info!");
        log.error("Some erorr happened!");

        log.trace("Trace message, yeah!");
    }
}

现在假设我有一个log4j2配置,其中包含一个包含2个过滤器的CompositeFilter:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            <Filters>
                <ThresholdFilter level="INFO" onMatch="NEUTRAL" onMismatch="NEUTRAL"/>
                <MarkerFilter marker="FLOW" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </Console>

    </Appenders>

    <Loggers>
        <Root level="trace">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

当我们运行这个简单的类时,我们得到以下输出:

22:35:31.666 [main] DEBUG example.SomeClass - This is some debug!

如果我们现在将ThresholdFilter的onMatch参数更改为ACCEPT

<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="NEUTRAL"/>

我们将获得此输出:

22:36:00.939 [main] DEBUG example.SomeClass - This is some debug!
22:36:00.941 [main] INFO  example.SomeClass - Here's some info!
22:36:00.941 [main] ERROR example.SomeClass - Some erorr happened!

首先,由于ThresholdFilter不接受或拒绝任何日志事件,因此它们都会传递到MarkerFilter,如果他们没有FLOW标记,则会被拒绝。当我们更改ThresholdFilter以接受匹配事件时,INFOERROR级别事件在到达MarkerFilter之前已被接受,因此已发布。我们仍然会看到DEBUG级别事件中的{0}}未被拒绝的日志消息,因为ThresholdFilter ThresholdFilter不匹配,NEUTRAL接受了此事件,因为它有MarkerFilter标记。

答案 1 :(得分:1)

简而言之回答您的问题: 实际上,将代码从“中性”更改为“接受”时,什么都不会改变。但这只有在只有一个过滤器(也有D.B.)的情况下才是正确的。

“中立”和“接受”仅在使用多个过滤器时有所不同。

如果您想按套思考:
您可以将所有日志分为关于一个过滤器的两组日志:
*日志消息(/事件)与此过滤器匹配
*或此过滤器不匹配日志消息(/事件)

如果您始终使用“中性”-“拒绝”组合(onMatch =“ NEUTRAL” + onMismatch =“ DENY”或onMatch =“ DENY” + onMismatch =“ NEUTRAL”),那么您会得到所有“ NEUTRAL”的交集-与过滤器有关的子集。 使用“中立”-“接受”组合可获得联合集。

但是您需要了解以下规则: 一旦过滤器触发“接受”或“拒绝”,则不会评估其他过滤器。因此,过滤器的顺序很重要。对于复合过滤器(<filters>标签)尤其如此。

您可以在不同位置使用过滤器。我认为,但我仍然不确定,该订单是按以下顺序评估的:

  
      
  1. 上下文范围的筛选器直接在配置中配置。这些过滤器拒绝的事件将不会传递给记录器以进行进一步处理。事件被上下文范围的过滤器接受后,它将不会被任何其他上下文范围的过滤器评估,也不会使用记录器的级别来过滤事件。但是,该事件将由Logger和Appender过滤器进行评估。
  2.   
  3. 记录器筛选器在指定的记录器上配置。这些是在上下文范围过滤器和记录器的日志级别之后评估的。无论这些可加性设置如何,这些过滤器拒绝的事件都将被丢弃,并且该事件不会传递给父Logger。
  4.   
  5. Appender过滤器用于确定特定的Appender是否应处理事件的格式和发布。
  6.   
  7. Appender参考过滤器用于确定Logger是否应将事件路由到附加程序。
  8.   

来源:https://logging.apache.org/log4j/2.0/manual/filters.html

答案 2 :(得分:0)

在描述过滤器时,如果您熟悉iptables防火墙规则,我会认为它们。当过滤器的onMatch值配置为ACCEPT时,表示“接受日志事件,而不考虑其他因素”。当onMatch值设置为DENY时,表示“无论其他因素如何都拒绝日志事件”。当该值设置为NEUTRAL时,仅表示该值未被拒绝或接受,因此应该继续对该日志事件进行进一步评估。

@ amin.miedl指出,可以在四个位置放置一个过滤器:

  1. 全局-这些是在附加程序和记录器之外配置的。即使在LogEvent路由到Logger之前,也要先处理它们。
  2. 在Logger上-为LogEvent选择了LoggerConfig,并检查了在其上配置的所有过滤器。
  3. 在Appender参考上-通过记录器配置后,将选择Appender参考。在将事件传递给Appender之前,将评估Appender参考中配置的所有过滤器。
  4. 在Appender上。 Appender是处理记录事件的最后一站。在Appender收到它之前,该Appender的包装器类称为LoggerControl,它会调用Appender上配置的所有过滤器。

还应注意,记录器和Appender引用可以配置为“记录级别”。您应该认为它们与在Logger and Appender Reference上配置的ThresholdFilter相当,其onMatch为NEUTRAL,onMismatch值为DENY,并且经过高度优化,因为实际上评估了每个日志记录事件的日志记录级别。