2010-04-14 11 views
7

J'utilise log4net pour enregistrer la progression de mon application Web, en utilisant Log4PostSharp pour AOP-injectify toutes les méthodes. Cela a l'effet désiré de journaliser (presque) tout et va bien.Filtrage log4net sur le nom de la méthode - impossible de l'obtenir

J'ai maintenant besoin d'enregistrer les méthodes JUST Page_Load dans un fichier/une console. Je peux évidemment bloquer la classe log4postsharp pour le faire, mais je perdrais alors tous les autres logs.

J'ai regardé les filtres dans log4net, en commençant par le filtre StringMatch, mais cela ne regarde que le message en cours d'enregistrement, et je suis après le nom de la méthode. Cela m'a mis sur le PropertyFilter, mais toujours sans joie. Mon extrait de log4net.config est donc:

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

Comme vous pouvez le voir, je suis en train de clé dans la MethodName de l'événement d'enregistrement via LocationInfo, mais je suis encore en train de tout connecté. EDIT: Comme mentionné dans les commentaires, j'ai maintenant inclus le DenyAllFilter que j'ai ajouté après RTFM ;-)

Quelqu'un peut-il aider?

Merci,

Mike K.

+0

NB: J'ai maintenant ajouté après le filtre pour arrêter tout le reste étant connecté une fois que je reçois le filtre de nom de méthode fonctionne –

+0

Avez-vous ajouté DenyAllFilter? Avez-vous tout ou rien connecté alors? vous devriez mettre à jour votre question pour refléter vos progrès. –

Répondre

4

Pour autant que je peux dire log4net ne sait pas une propriété LocationInfo.MethodName. Je n'utilise pas Log4PostSharp, donc je ne peux pas dire avec certitude si Log4PostSharp créerait cette propriété.

Je voudrais écrire mon propre filtre comme celui-ci pour filtrer par des noms de méthode (partie regex omise):

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

Remarque: L'accès LocationInfo est cher et peut avoir un effet notable sur les performances. Vous pouvez envisager de modifier Log4PostSharp pour extraire le nom de la méthode pendant le tissage et le stocker dans une propriété. Dans ce cas, vous pouvez utiliser le filtre de propriétés comme vous le vouliez et vous n'aurez aucun impact sur les performances. Je ne sais pas si cela fonctionne vraiment mais je m'attendrais à ce que cela soit possible.

La configuration ressemblerait à quelque chose comme ceci:

<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

Où/comment m_stringToMatch est-il passé? –

+0

Vous configurez ce nouveau filtre de la même manière que le filtre de propriétés. Vous n'avez simplement pas besoin de la partie . voir aussi ma réponse révisée. –

+0

Merci - avoir un Bounty ;-) –