首先,我只想提一個項目,然後再回答你的問題。你寫道:
日誌INFO,WARNING,ERROR和FATAL。所以它接縫中性,其中 是默認值,意思是:不要過濾任何東西,讓日誌 通過。
這並不完全準確,因爲TRACE和DEBUG級別的事件不會發布,因爲它們被過濾器的onMismatch參數的默認值過濾掉了。根據ThresholdFilter documentation:
onMismatch [是]當過濾器不匹配時採取的操作。可能是ACCEPT,DENY或者NEUTRAL。 默認值是DENY。
再回到你的問題,使用單過濾器時NEUTRAL
和ACCEPT
之間的區別是什麼,他們的行爲是相同的。但是,如果您使用CompositeFilter,則會有很大的差異。
比方說,我有一個簡單的類,生成一些日誌:
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!
如果我們現在ch昂熱的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
更改爲接受匹配事件時,在達到MarkerFilter
之前接受了INFO
和ERROR
級別事件,因此已發佈。我們仍然看到DEBUG
級別事件的日誌消息未被ThresholdFilter
拒絕,因爲ThresholdFilter
是NEUTRAL
到不匹配,而MarkerFilter
接受了該事件,因爲它有FLOW
標記。