2010-08-04 8 views
3

Situation: Je souhaite afficher la méthode et le numéro de ligne du code qui enregistre un message. Le problème est que j'ai une classe intermédiaire qui appelle l'enregistreur log4net. Malheureusement, en raison des problèmes architecturaux existants, je ne peux pas faire disparaître cette classe intermédiaire. Le résultat est que je vois toujours la méthode et le numéro de ligne comme étant dans la classe intermédiaire. Pas ce que je veux.log4net: CustomLayoutConverter personnalisé n'étant pas appelé

J'ai donc essayé de créer un PatternLayoutConverter personnalisé, selon cette question:

Does log4net support including the call stack in a log message

Je suis également configure programme log4net depuis, encore une fois pour des raisons architecturales, en utilisant un fichier de configuration XML est impossible (I Il est également ridicule que la façon la plus simple et la plus documentée de configurer log4net soit de passer par un fichier XML stupide, mais c'est un sujet de discussion supplémentaire. Donc j'ai suivi ce fil.

How to configure log4net programmatically from scratch (no config)

Tout fonctionne bien, sauf que mon convertisseur personnalisé est jamais appelé. Voici le code pour le convertisseur de mesure:

public class TVPatternLayout : PatternLayout { 
    public TVPatternLayout() { 
     this.AddConverter("logsite", typeof(TVPatternLayoutConverter)); 
    } 
} 

public class TVPatternLayoutConverter : PatternLayoutConverter { 
    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { 
     StackTrace st = new StackTrace(); 
     int idx = 1; 
     while(st.GetFrame(idx).GetMethod().DeclaringType.Assembly == typeof(LogManager).Assembly) 
      idx++; 
     writer.Write(String.Format("{0}.{1} (line {2})", st.GetFrame(idx).GetMethod().DeclaringType.Name, st.GetFrame(idx).GetMethod().Name, 
        st.GetFrame(idx).GetFileLineNumber())); 
    } 
} 

Et voici le code où je configure l'enregistreur:

Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); 
hierarchy.Configured = false; 

RollingFileAppender appender = new RollingFileAppender(); 
appender.Name = loggerName; 
appender.File = realPath; 
appender.AppendToFile = true; 
appender.MaximumFileSize = "8000"; 
appender.MaxSizeRollBackups = 2; 

TVPatternLayout patternLayout = new TVPatternLayout(); 
patternLayout.ConversionPattern = logFormat; // includes %logsite, my custom option 
appender.Layout = patternLayout; 

appender.ActivateOptions(); 
hierarchy.Root.AddAppender(appender); 

hierarchy.Root.Level = Level.All; 
hierarchy.Configured = true; 

Répondre

5

problème était que j'ai oublié d'appeler ActivateOptions() sur le PatternLayout. Naturellement, je trouverais cela juste après avoir écrit une longue question.

Questions connexes