首页 > 解决方案 > 如何将 processid 添加到 log4net 布局?

问题描述

我将log4net在我的wpf应用程序中使用。我需要日志中的消息如下所示:

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

在哪里写这条消息13processId所以这很容易。但不幸的是,我无法做到这一点。所以我只需要为我的log4net记录器设置一个合适的模式布局。

我在官方网站的常见问题部分发现了以下消息:log4net

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

<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.

我也找到了一个答案。它有效。但是%processid属性在启动期间只初始化一次。在我的应用程序中,写作过程经常发生变化。所以这个解决方案不适合我。我猜它可以通过默认log4net布局设置来实现。

另一种选择是type="log4net.Util.PatternString"用作 my 的一种conversionPattern。但它也不适合(如果我type="log4net.Util.PatternString"conversionPatternthen中使用这种类型 - %threadId%level甚至%message会打印为字符串常量)。

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

但我需要两者%threadId%processid登录。

标签: c#.netlogginglog4netlog4net-configuration

解决方案


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

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>

推荐阅读