情況:我想顯示記錄消息的代碼的方法和行號。問題是我有一個調用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;