Как добавить processid в макет log4net? - PullRequest
0 голосов
/ 23 ноября 2018

Я собираюсь использовать log4net в моем wpf приложении.И мне нужны сообщения в моем журнале, которые выглядят так:

11/8/2018 10:49:38 AM   13 (5368)       properties disabled.

, где 13 - processId, который пишет это сообщение.Так что это довольно легко.Но, к сожалению, я не могу этого достичь.Поэтому мне просто нужен соответствующий макет шаблона для моего log4net регистратора.

Я нашел следующее сообщение в разделе часто задаваемых вопросов log4net официального сайта:

В следующем примере задается имя файла для FileAppender для включения идентификатора текущего процесса, указав шаблон %processid в свойстве File.

<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
    <file type="log4net.Util.PatternString" value="log-file-[%processid].txt" />
    <layout type="log4net.Layout.PatternLayout" value="%date [%thread] %-5level %logger - %message%newline" />
</appender>

Так что это работает, нотолько для имени файла, а не для макета в моем файле журнала.И мне нужно поместить это %processid в мой макет.И мой текущий макет:

<layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date{dd/MM/yyyy HH:mm:ss,fff tt} %processid (%thread) - %message%newline" />
</layout>

И мой журнал просто записывает processid строку в мой файл журнала.

22/11/2018 16:21:51,863 PM processid (1) - Exiting application.

Я также нашел a SO ответ .И это работает.Но свойство %processid инициализируется только один раз при запуске.И в моем приложении процесс записи часто меняется .Так что это решение мне не подходит.И я думаю, что это может быть достигнуто по умолчанию log4net настройки макета.

Другой вариант использует type="log4net.Util.PatternString" как тип моего conversionPattern.Но это также не подходит (если я использую этот тип - type="log4net.Util.PatternString" - в conversionPattern, тогда %threadId, %level и даже %message будут печататься как строковые константы).

23/11/2018 16:22:52,456 PM 31560 [thread] level - message

Но мне нужны и %threadId, и %processid в журнале.

1 Ответ

0 голосов
/ 26 ноября 2018

Вы можете реализовать пользовательский PatternLayoutConverter, который выводит идентификатор процесса.
Для этого вам не нужно устанавливать и отслеживать идентификатор запущенного процесса.

namespace PFX
{
    class ProcessIdPatternLayoutConverter : PatternLayoutConverter
    {
        protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            Int32 processId = Process.GetCurrentProcess().Id;
            writer.Write(processId);
        }
    }
}

Затем вы ссылаетесь на этот PatternLayoutConverter в вашей конфигурации Log4net через полное имя сборки, как показано ниже.

<layout type="log4net.Layout.PatternLayout">                        
    <converter>
        <name value="processid" />
        <type value="PFX.ProcessIdPatternLayoutConverter, PFX.Lib" />
    </converter>            
    <conversionPattern value="%date{dd/MM/yyyy HH:mm:ss,fff tt} %processid (%thread) - %message%newline" />
</layout>
...