如果我在log4j xml文件中使用简单的阈值过滤器,这只是意味着从过滤器级别开始记录所有内容。所以
<ThresholdFilter level="INFO" onMatch="NEUTRAL"/>
记录INFO,WARNING,ERROR和FATAL。所以NEUTRAL这是默认值的接缝意味着:不要过滤掉任何内容并让日志通过。
如果我将其更改为
<ThresholdFilter level="INFO" onMatch="ACCEPT"/>
该怎么办?
答案 0 :(得分:5)
首先我想在回答你的问题之前提一个项目。你写道:
记录INFO,WARNING,ERROR和FATAL。所以它接缝中性,哪个 是默认值,表示:不过滤掉任何内容并让日志 经历。
由于过滤器的onMismatch参数的默认值过滤掉了TRACE和DEBUG级别事件,因此不完全准确。根据{{3}}:
onMismatch [是]过滤器不匹配时要采取的操作。可能是接受,拒绝或中立。 默认值为DENY。
回到你的问题,使用单个过滤器时NEUTRAL
和ACCEPT
之间的区别是什么,它们的行为相同。但是,当您使用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
以接受匹配事件时,INFO
和ERROR
级别事件在到达MarkerFilter
之前已被接受,因此已发布。我们仍然会看到DEBUG
级别事件中的{0}}未被拒绝的日志消息,因为ThresholdFilter
ThresholdFilter
不匹配,NEUTRAL
接受了此事件,因为它有MarkerFilter
标记。
答案 1 :(得分:1)
简而言之回答您的问题: 实际上,将代码从“中性”更改为“接受”时,什么都不会改变。但这只有在只有一个过滤器(也有D.B.)的情况下才是正确的。
“中立”和“接受”仅在使用多个过滤器时有所不同。
如果您想按套思考:
您可以将所有日志分为关于一个过滤器的两组日志:
*日志消息(/事件)与此过滤器匹配
*或此过滤器不匹配日志消息(/事件)
如果您始终使用“中性”-“拒绝”组合(onMatch =“ NEUTRAL” + onMismatch =“ DENY”或onMatch =“ DENY” + onMismatch =“ NEUTRAL”),那么您会得到所有“ NEUTRAL”的交集-与过滤器有关的子集。 使用“中立”-“接受”组合可获得联合集。
但是您需要了解以下规则:
一旦过滤器触发“接受”或“拒绝”,则不会评估其他过滤器。因此,过滤器的顺序很重要。对于复合过滤器(<filters>
标签)尤其如此。
您可以在不同位置使用过滤器。我认为,但我仍然不确定,该订单是按以下顺序评估的:
- 上下文范围的筛选器直接在配置中配置。这些过滤器拒绝的事件将不会传递给记录器以进行进一步处理。事件被上下文范围的过滤器接受后,它将不会被任何其他上下文范围的过滤器评估,也不会使用记录器的级别来过滤事件。但是,该事件将由Logger和Appender过滤器进行评估。
- 记录器筛选器在指定的记录器上配置。这些是在上下文范围过滤器和记录器的日志级别之后评估的。无论这些可加性设置如何,这些过滤器拒绝的事件都将被丢弃,并且该事件不会传递给父Logger。
- Appender过滤器用于确定特定的Appender是否应处理事件的格式和发布。
- Appender参考过滤器用于确定Logger是否应将事件路由到附加程序。
答案 2 :(得分:0)
在描述过滤器时,如果您熟悉iptables防火墙规则,我会认为它们。当过滤器的onMatch值配置为ACCEPT时,表示“接受日志事件,而不考虑其他因素”。当onMatch值设置为DENY时,表示“无论其他因素如何都拒绝日志事件”。当该值设置为NEUTRAL时,仅表示该值未被拒绝或接受,因此应该继续对该日志事件进行进一步评估。
@ amin.miedl指出,可以在四个位置放置一个过滤器:
还应注意,记录器和Appender引用可以配置为“记录级别”。您应该认为它们与在Logger and Appender Reference上配置的ThresholdFilter相当,其onMatch为NEUTRAL,onMismatch值为DENY,并且经过高度优化,因为实际上评估了每个日志记录事件的日志记录级别。