如何将processid添加到log4net布局?

时间:2018-11-23 11:03:23

标签: c# .net logging log4net log4net-configuration

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

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

其中13processId,它写了此消息。所以这很容易。但不幸的是我无法实现这一目标。因此,我只需要为log4net记录器提供合适的模式布局即可。

我在log4net官方网站的常见问题解答部分中找到了following message

  

以下示例将FileAppender的文件名设置为包括   通过在   文件属性。

%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

我也找到了一个SO answer。而且有效。但是22/11/2018 16:21:51,863 PM processid (1) - Exiting application. 属性在启动期间仅初始化一次。在我的应用程序中,写作过程经常会发生变化。因此,此解决方案不适合我。而且我想可以通过默认%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

1 个答案:

答案 0 :(得分:5)

您可以实现自定义PatternLayoutConverter,该自定义https://github.com/hustcc/jest-canvas-mock输出流程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>