2016-08-15 3 views
0

Ich benutze log4net und ich versuche, einen Filter zu verwenden, so dass nur ein Appender in eine bestimmte Datei schreiben kann.log4net filter funktioniert nicht

Kann mir jemand sagen, warum das nicht funktioniert? Ich möchte nur die appender „ErrorLogFileAppender“ genannt, in die Datei zu schreiben ..

<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> 

Dies ist, wie ich den Logger erhalten die in der Lage sein sollte, in die Datei zu schreiben:

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

Aber diese Logger (in einer anderen Klasse verwendet wird) kann auch auf die gleiche Datei schreiben, die falsch ist:

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

FWIW, ich glaube, Sie‘ Dies unterscheidet sich von der Art und Weise, wie log4net mit diesem Ansatz arbeitet - Ihr Code sollte nicht wissen, dass er sich bei einem 'ErrorLogFileAppender' anmeldet, er sollte nur auf der richtigen Ebene loggen - sich Gedanken darüber machen, wo und was gerade in Ihrer Konfiguration protokolliert wird . –

+0

Guter Gedanke. Ich werde einige Änderungen sehen. Aber mein Problem mit dem Filter ist immer noch da, obwohl – MrProgram

+0

Oh ja, Sie werden immer noch die Filter usw. in irgendeiner Weise arbeiten müssen, wenn Sie nur Fehler von einer bestimmten Komponente protokollieren möchten. Oder richten Sie nur diesen Logger ein, um diesen Appender zu verwenden ... –

Antwort

2

Von the documentation:

Filter bilden eine Kette, die das Ereignis durchlaufen muss. Jeder Filter auf dem Weg kann das Ereignis akzeptieren und die Verarbeitung stoppen, das Ereignis ablehnen und die Verarbeitung stoppen oder das Ereignis für den nächsten Filter zulassen. Wenn das Ereignis an das Ende der Filterkette gelangt, ohne abgelehnt zu werden, wird es implizit akzeptiert und protokolliert.

(Hervorhebung von mir)

Da Sie alles keinen Filter an der richtigen Stelle zu leugnen, dass nicht ein ErrorLogFileAppender, wird alles noch angemeldet werden. Sie können dieses Problem beheben, indem ein DenyAllFilter einschließlich: Alternativ

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

, können Sie log4net so konfigurieren, dass nur dass Logger verwendet, dass appender, zB:

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