2009-04-15 3 views
4

Ich möchte Nachrichten filtern, die angegebene Zeichenfolge enthalten. Ich habe log4net.Filter.StringMatchFilter verwendet, aber das gilt nur für Appender.Können Sie auf Logger-Ebene in log4net filtern

Ich möchte schon, dass die Nachricht auf Logger Ebene filtern. Etwas in dieser Richtung:

<logger name="MyLogger.WebServices"> 
    <level value="Debug" /> 
    <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="do not log me" /> 
     <acceptOnMatch value="false" /> 
    </filter> 
    <appender-ref ref="file" /> 
    <appender-ref ref="debug" /> 
</logger> 

Ist es tatsächlich so möglich? Oder gibt es einen anderen Weg, mit dieser Situation umzugehen?

Antwort

11

Die Filter sind nur für den Einsatz mit Appendern geeignet. Wenn Sie Ereignisse für mehrere Appender herausfiltern möchten, können Sie einen Forwarding-Appender verwenden. Auf diese Weise vermeiden Sie das Kopieren und Einfügen desselben Filters auf mehrere Appender.

Ihr Beispiel würde wie folgt aussehen:

<appender name="screeningAppender" type="log4net.Appenders.ForwardingAppender"> 
    <filter type="log4net.Filter.StringMatchFilter"> 
      <stringToMatch value="do not log me" /> 
      <acceptOnMatch value="false" /> 
    </filter> 

    <appender-ref ref="file" /> 
    <appender-ref ref="debug" /> 
</appender> 

<logger name="MyLogger.WebServices"> 
    <level value="Debug" /> 
    <appender-ref ref="screeningAppender" /> 
</logger> 
+0

Das ist, was ich fürchtete. Prost! – Rashack

+0

Ich hatte gedacht, einen benutzerdefinierten Appender zu machen oder von einem, der umweltbewusst war (z. B. Entwickler oder Produktion) abzuleiten, aber ich mag die Idee, dies auf einen Filter zu verschieben, um allen Anhängern diese Fähigkeit zu "geben". – Kit

+0

Leider hat es bei mir nicht funktioniert. Ich verwendete einen LevelToMatch-Filter und es wurde nicht weitergeleitet. Vielleicht liegt es daran, dass der Filter ein acceptOnMatch = true war mit einem denyAll folgenden ... weiß nicht. – Alex