log4net: пользовательский PatternLayoutConverter не вызывается - PullRequest
3 голосов
/ 05 августа 2010

Ситуация: я хочу показать метод и номер строки для кода, который регистрирует сообщение. Проблема в том, что у меня есть промежуточный класс, который вызывает в log4net logger. К сожалению, из-за существующих архитектурных проблем я не могу покончить с этим промежуточным классом. В результате я всегда вижу метод и номер строки в промежуточном классе. Не то, что я хочу.

Итак, я попытался создать собственный 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;

1 Ответ

7 голосов
/ 05 августа 2010

Проблема была в том, что я забыл вызвать ActivateOptions () для patternLayout.Естественно, я бы понял это сразу после написания длинного вопроса.

...