2016-08-15 320 views
0

我正在使用log4net,我正在嘗試使用過濾器,以便只有一個appender可以寫入特定的文件。log4net過濾器不工作

有誰能告訴我爲什麼這不起作用?我想只有所謂的「ErrorLogFileAppender」寫入到該文件的附加器..

<appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="..\\WebErrors.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="2" /> 
    <maximumFileSize value="10MB" /> 
    <staticLogFileName value="true" /> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%d [%t] %-5p %logger{1} %m%n" /> 
    </layout> 

    <filter type="log4net.Filter.LoggerMatchFilter"> 
    <!-- allows this sub-namespace to be logged... --> 
    <loggerToMatch value="ErrorLogFileAppender" /> 
    </filter> 

</appender> 

這是我得到的是應該能夠寫入文件記錄器:

private static ILog _fileLogger = LogManager.GetLogger("ErrorLogFileAppender"); 

但這記錄器(在另一個類中)也可以寫同一個文件,這是錯誤的:

private static ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
+0

FWIW,我想你」重新偏離log4net被設計爲使用這種方法的方式 - 你的代碼不應該知道它正在記錄到一個'ErrorLogFileAppender',它應該只是登錄到正確的級別 - 擔心你的配置中實際記錄的內容和地方。 –

+0

好想法。將看一些變化。但我的過濾器的問題仍然存在,雖然 – MrProgram

+0

哦,是的,你仍然需要過濾器等以某種方式工作,如果你想只記錄特定組件的錯誤。或者只設置該記錄器來使用該appender ... –

回答

2

the documentation

過濾器形成事件必須通過的鏈。沿途的任何過濾器都可以接受事件並停止處理,否認事件並停止處理,或允許事件進入下一個過濾器。 如果事件到達過濾器鏈的末尾而沒有被拒絕,它將被隱式接受並記錄下來。

(重點煤礦)

既然你沒有到位的過濾器來拒絕任何不是一個ErrorLogFileAppender,一切都將仍然記錄。您可以通過包括DenyAllFilter解決這個問題:

<filter type="log4net.Filter.LoggerMatchFilter"> 
    <!-- allows this sub-namespace to be logged... --> 
    <loggerToMatch value="ErrorLogFileAppender" /> 
</filter> 
<filter type="log4net.Filter.DenyAllFilter" /> 

或者,您可以配置log4net的,這樣該記錄器使用該附加器,如:

<logger name="ErrorLogFileAppender"> 
    <appender-ref ref="ErrorLogFileAppender" /> 
</logger>