情景:我想显示记录消息的代码的方法和行号。问题是我有一个调用log4net记录器的中间类。不幸的是,由于现有的架构问题,我不能取消这个中间类。结果是我总是把方法和行号看作是中间类。不是我想要的。
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;