2010-04-14 3 views
7

Ich benutze log4net, um den Fortschritt meiner Webanwendung zu protokollieren, indem ich Log4PostSharp zu AOP-injectify alle Methoden verwende. Dies hat den gewünschten Effekt, dass (fast) alles protokolliert wird und in Ordnung ist.Log4net auf Methodenname filtern - kann es nicht ganz bekommen

Ich habe jetzt eine Anforderung, JUST Page_Load Methoden zu einer Datei/Konsole zu protokollieren. Ich kann natürlich die log4postsharp-Klasse dazu bringen, das zu tun, aber dann würde ich die gesamte andere Protokollierung verlieren.

Ich habe Filter in log4net, beginnend mit dem StringMatch-Filter, aber das schaut nur auf die Nachricht wird protokolliert, und ich bin nach dem Namen der Methode. Das brachte mich auf den PropertyFilter, aber immer noch ohne Freude. Mein log4net.config Schnipsel ist also:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <filter type="log4net.Filter.PropertyFilter"> 
    <key value="LocationInfo.MethodName"/> 
    <stringToMatch value="Page_Load"/> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    <file value="d:\\xxxx\\yyyyy\\zzzzLog"/> 

Wie Sie sehen können, ich versuche, über LocationInfo in die Method des Protokolliervorgangs einzugeben, aber ich bin immer noch alles angemeldet zu werden. EDIT: Wie in den Kommentaren erwähnt, habe ich jetzt den DenyAllFilter, den ich nach RTFM hinzugefügt habe ;-)

Kann jemand helfen?

Danke,

Mike K.

+0

NB: Ich habe jetzt hinzugefügt nach dem Filter, alles zu stoppen sonst protokolliert sobald ich Der Methodenname funktioniert –

+0

Haben Sie DenyAllFilter hinzugefügt? Hast du dann alles oder nichts eingeloggt? Sie sollten Ihre Frage aktualisieren, um Ihren Fortschritt zu reflektieren. –

Antwort

4

Soweit ich log4net keineEigenschaftLocationInfo.MethodName nicht sagen kann, wissen. Ich verwende Log4PostSharp nicht, daher kann ich nicht mit Sicherheit sagen, ob Log4PostSharp diese Eigenschaft erstellen würde.

würde ich meine eigene Filter so schreiben von Methodennamen (regex Teil weggelassen) zu filtern:

public class MethodNameFilter : StringMatchFilter 
{  
    override public FilterDecision Decide(LoggingEvent loggingEvent) 
    { 
     if (loggingEvent == null) 
     { 
       throw new ArgumentNullException("loggingEvent"); 
     } 

     var locationInfo = loggingEvent.LocationInformation; 

     // Check if we have been setup to filter 
     if (locationInfo == null || (m_stringToMatch == null && m_regexToMatch == null)) 
     { 
      // We cannot filter so allow the filter chain 
      // to continue processing 
       return FilterDecision.Neutral; 
     } 

     if (m_stringToMatch != null) 
     { 
      // Check substring match 
      if (locationInfo.MethodName.IndexOf(m_stringToMatch) == -1) 
      { 
        // No match, continue processing 
        return FilterDecision.Neutral; 
      } 

      // we've got a match 
      if (m_acceptOnMatch) 
      { 
        return FilterDecision.Accept; 
      } 
      return FilterDecision.Deny; 
     } 
     return FilterDecision.Neutral; 
    } 
} 

Hinweis: Um LocationInfo ist teuer und einen spürbaren Effekt auf die Leistung haben kann. Sie könnten Log4PostSharp ändern, um den Methodennamen während des Webens zu extrahieren und in einer Eigenschaft zu speichern. In diesem Fall könnten Sie den Eigenschaftsfilter wie vorgesehen verwenden und Sie hätten keinen Einfluss auf die Leistung. Nicht sicher, ob das wirklich funktioniert, aber ich würde erwarten, dass dies möglich ist.

Die Konfiguration würde wie folgt aussehen:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <filter type="YourNameSpace.MethodNameFilter"> 
     <stringToMatch value="Page_Load"/> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    <file value="d:\\xxxx\\yyyyy\\zzzzLog"/> 
+0

Wo/wie würde m_stringToMatch übergeben werden? –

+0

Sie konfigurieren diesen neuen Filter auf die gleiche Weise wie den Eigenschaftenfilter. Sie müssen einfach nicht den Teil haben. Siehe auch meine überarbeitete Antwort. –

+0

Danke - haben Sie eine Prämie ;-) –