簡體   English   中英

log4net:未調用自定義PatternLayoutConverter

[英]log4net: Custom PatternLayoutConverter not being called

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

這是我配置記錄器的代碼:

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;

問題是我忘了在patternLayout上調用ActivateOptions()。 當然,在寫了一個很長的問題之后我就會想出來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM