2010-08-04 63 views
3

情況:我想顯示記錄消息的代碼的方法和行號。問題是我有一個調用log4net記錄器的中間類。不幸的是,由於現有的架構問題,我不能廢除這個中級課程。結果是我總是將方法和行號看作中間類。不是我想要的。log4net:自定義PatternLayoutConverter不被調用

所以我試圖創建一個自定義PatternLayoutConverter,按照這樣的問題:

Does log4net support including the call stack in a log message

我也編程建築方面的原因配置log4net的,因爲,再一次,使用XML配置文件是不可行的(我也發現可笑的是,配置log4net的首選和唯一記錄方式是通過一個愚蠢的XML文件,但這是另一個討論的話題)。所以我遵循這個線程。除了我的自定義轉換器永遠不會被調用

How to configure log4net programmatically from scratch (no config)

,一切工作正常。這是自定義轉換器的代碼:

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

這裏是我配置記錄代碼:

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; 

回答

5

問題是,我忘了打電話給ActivateOptions()上的PatternLayout。當然,在寫下一個長問題之後,我想清楚了。

相關問題