2010-02-25 3 views
3

Comment filtrer la journalisation en fonction du message d'une exception enregistrée?Filtrage log4net sur un message d'exception?

code

ressemble à ceci:

try { 
    someService.DoSomeWorkflow(); 
} catch(Exception e) { 
    log.Error("Hey I have an error", e); 
} 

Config ressemble à ceci:

<appender name="EventLogger" type="log4net.Appender.EventLogAppender"> 
    <applicationName value="foo" /> 
    <layout type="log4net.Layout.PatternLayout" value="PID:%P{pid}: %message" /> 
    <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="TextInsideTheException" /> 
    </filter> 
</appender> 

Je trouve que je peux filtrer seulement sur le message connecté ("Hé, j'ai une erreur") mais il semble ignorer le message de l'exception. Comme c'est dans notre environnement de production, je ne peux pas modifier le code, donc je ne peux pas changer le message enregistré. Y a-t-il une configuration qui spécifierait aussi de vérifier le message de l'exception?

Répondre

2

Par FilterSkeleton sous-classement, vous pouvez mettre en place un filtre qui permet d'évaluer le texte d'exception. Ou type d'exception d'ailleurs.

+0

Cela est logique. –

0

Essayez ceci:

log.Error("Hey I have an error: " + e.Message); 

Edit: Désolé, ne voyez pas que vous ne pouvez pas changer cette ligne ...

0

Voici les implémentations de base en fonction de la réponse acceptée Peter

using System; 
using log4net.Core; 

namespace log4net.Filter 
{ 
    public abstract class ExceptionFilterBase : FilterSkeleton 
    { 
     public override FilterDecision Decide(LoggingEvent loggingEvent) 
     { 
      if (loggingEvent == null) 
       throw new ArgumentNullException("loggingEvent"); 

      var str = GetString(loggingEvent); 
      if (StringToMatch == null || string.IsNullOrEmpty(str) || !str.Contains(StringToMatch)) 
       return FilterDecision.Neutral; 
      return AcceptOnMatch ? FilterDecision.Accept : FilterDecision.Deny; 
     } 

     protected abstract string GetString(LoggingEvent loggingEvent); 

     public string StringToMatch { get; set; } 

     public bool AcceptOnMatch { get; set; } 
    } 

    public class ExceptionMessageFilter : ExceptionFilterBase 
    { 
     protected override string GetString(LoggingEvent loggingEvent) 
     { 
      return loggingEvent.ExceptionObject == null 
       ? null : loggingEvent.ExceptionObject.Message; 
     } 
    } 

    public class ExceptionTypeFilter : ExceptionFilterBase 
    { 
     protected override string GetString(LoggingEvent loggingEvent) 
     { 
      return loggingEvent.ExceptionObject == null 
       ? null : loggingEvent.ExceptionObject.GetType().FullName; 
     } 
    } 

    public class ExceptionStackFilter : ExceptionFilterBase 
    { 
     protected override string GetString(LoggingEvent loggingEvent) 
     { 
      return loggingEvent.ExceptionObject == null 
       ? null : loggingEvent.ExceptionObject.StackTrace; 
     } 
    } 
} 

fichier de configuration

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="Client.log" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date{yyyy/MM/dd HH:mm:ss,fff} [%-5level] %logger - %message%newline" /> 
    </layout> 
    <filter type="log4net.Filter.StringMatchFilter"> 
    <stringToMatch value="Token is not valid." /> 
    <acceptOnMatch value="false" /> 
    </filter> 
    <filter type="log4net.Filter.ExceptionMessageFilter, YourAssembly"> 
    <stringToMatch value="Application is not installed." /> 
    <acceptOnMatch value="false" /> 
    </filter> 
    <filter type="log4net.Filter.ExceptionTypeFilter, YourAssembly"> 
    <stringToMatch value="System.Deployment.Application.DeploymentException" /> 
    <acceptOnMatch value="false" /> 
    </filter> 
    <filter type="log4net.Filter.ExceptionStackFilter, YourAssembly"> 
    <stringToMatch value="at System.Deployment.Application.ComponentStore.GetPropertyString(DefinitionAppId appId, String propName)" /> 
    <acceptOnMatch value="false" /> 
    </filter> 
</appender>