代码之家  ›  专栏  ›  技术社区  ›  siride

log4net:未调用自定义PatternLayoutConverter

  •  3
  • siride  · 技术社区  · 15 年前

    情景:我想显示记录消息的代码的方法和行号。问题是我有一个调用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;
    
    1 回复  |  直到 9 年前
        1
  •  7
  •   siride    15 年前

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