log4net:未调用自定义PatternLayoutConverter

sir*_*ide 3 .net c# configuration logging log4net

情况:我想显示记录消息的代码的方法和行号.问题是我有一个调用log4net记录器的中间类.不幸的是,由于现有的架构问题,我无法取消这个中级课程.结果是我总是将方法和行号看作是在中间类中.不是我想要的.

所以我尝试创建一个自定义的PatternLayoutConverter,根据这个问题:

log4net是否支持在日志消息中包含调用堆栈

我也是以编程方式配置log4net,因为再次出于体系结构的原因,使用XML配置文件是不可行的(我也觉得配置log4net的首选和唯一记录的方法是通过一个愚蠢的XML文件,这是另一个主题,这是荒谬的讨论).所以我跟着这个帖子.

如何从头开始以编程方式配置log4net(无配置)

除了从不调用我的自定义转换器外,一切正常.以下是自定义转换器的代码:

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()));
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我配置记录器的代码:

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;
Run Code Online (Sandbox Code Playgroud)

sir*_*ide 7

问题是我忘了在patternLayout上调用ActivateOptions().当然,在写了一个很长的问题之后我就会想出来.