2017-08-17 27 views
0

如果我在log4j xml文件中使用簡單的閾值過濾器,這意味着記錄過濾器級別以上的所有內容。所以對於log4j,在閾值過濾器中接受vs中性

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

記錄信息,警告,錯誤和致命。所以它接縫說,中性,這是默認值,意思是:不要過濾掉任何東西,讓日誌通過。

如果我改變了對

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

什麼是它應該做的?

回答

0

首先,我只想提一個項目,然後再回答你的問題。你寫道:

日誌INFO,WARNING,ERROR和FATAL。所以它接縫中性,其中 是默認值,意思是:不要過濾任何東西,讓日誌 通過。

這並不完全準確,因爲TRACE和DEBUG級別的事件不會發布,因爲它們被過濾器的onMismatch參數的默認值過濾掉了。根據ThresholdFilter documentation

onMismatch [是]當過濾器不匹配時採取的操作。可能是ACCEPT,DENY或者NEUTRAL。 默認值是DENY。

再回到你的問題,使用過濾器時NEUTRALACCEPT之間的區別是什麼,他們的行爲是相同的。但是,如果您使用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之前接受了INFOERROR級別事件,因此已發佈。我們仍然看到DEBUG級別事件的日誌消息未被ThresholdFilter拒絕,因爲ThresholdFilterNEUTRAL到不匹配,而MarkerFilter接受了該事件,因爲它有FLOW標記。