如何将processid添加到log4net布局?

isx*_*ker 3 .net c# logging log4net log4net-configuration

我将log4net在我的wpf申请中使用.我需要在我的日志中的消息如下所示:

11/8/2018 10:49:38 AM   13 (5368)       properties disabled.
Run Code Online (Sandbox Code Playgroud)

其中13processId其中写入该消息.所以这很容易.但不幸的是我无法做到这一点.所以我只需要一个适合我的log4net记录器的模式布局.

我在官方网站的faq部分找到了以下消息log4net:

以下示例FileAppender通过%processid在File属性中指定模式来设置a的文件名以包括当前进程ID .

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

所以,它的工作原理,但仅适用于我的日志文件中的文件名而不是布局.我需要把它%processid放到我的布局中.我目前的布局是:

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

我的日志只是将processid字符串写入我的日志文件.

22/11/2018 16:21:51,863 PM processid (1) - Exiting application.
Run Code Online (Sandbox Code Playgroud)

我也找到答案.它有效.但是%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
Run Code Online (Sandbox Code Playgroud)

但是我需要两个%threadId并且%processid在日志中.

pfx*_*pfx 5

您可以实现PatternLayoutConverter 输出进程ID 的自定义.
这样做,您不必设置和跟踪正在运行的进程的ID.

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

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