【发布时间】:2011-03-25 12:34:59
【问题描述】:
情况:我想显示记录消息的代码的方法和行号。问题是我有一个调用 log4net 记录器的中间类。不幸的是,由于现有的架构问题,我无法取消这个中间类。结果是我总是将方法和行号视为在中间类中。不是我想要的。
所以我尝试根据这个问题创建一个自定义 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;
【问题讨论】:
标签: c# .net logging configuration log4net