如何将 processid 添加到 log4net 布局?
How to add processid to log4net layout?
我将在我的 wpf
应用程序中使用 log4net
。我需要日志中的消息如下所示:
11/8/2018 10:49:38 AM 13 (5368) properties disabled.
其中 13
是写此消息的 processId
。所以这很容易。但不幸的是我无法做到这一点。所以我只需要一个适合我的 log4net
记录器的模式布局。
我在 log4net
官方网站的常见问题解答部分找到了 following message:
The following example sets the file name for a FileAppender
to include
the current process id by specifying the %processid
pattern in the
File property.
<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.
我还找到一个SO answer。它有效。但是 %processid
属性 在启动时只初始化一次。在我的应用程序中,写作过程经常发生变化。所以这个解决方案不适合我。而且我猜它可以通过默认 log4net
布局设置来实现。
另一种选择是使用 type="log4net.Util.PatternString"
作为我的 conversionPattern
的类型。但它也不合适(如果我在 conversionPattern
中使用这种类型 - type="log4net.Util.PatternString"
- 那么 %threadId
、%level
甚至 %message
将打印为字符串常量)。
23/11/2018 16:22:52,456 PM 31560 [thread] level - message
但我需要 %threadId
和 %processid
在日志中。
您可以实现自定义 PatternLayoutConverter
输出进程 ID。
这样做,您不必设置和跟踪 运行 进程的 ID。
namespace PFX
{
class ProcessIdPatternLayoutConverter : PatternLayoutConverter
{
protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
Int32 processId = Process.GetCurrentProcess().Id;
writer.Write(processId);
}
}
}
然后您通过其完全限定的程序集名称在您的 Log4net
config 中引用此 PatternLayoutConverter
,如下所示。
<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>
我将在我的 wpf
应用程序中使用 log4net
。我需要日志中的消息如下所示:
11/8/2018 10:49:38 AM 13 (5368) properties disabled.
其中 13
是写此消息的 processId
。所以这很容易。但不幸的是我无法做到这一点。所以我只需要一个适合我的 log4net
记录器的模式布局。
我在 log4net
官方网站的常见问题解答部分找到了 following message:
The following example sets the file name for a
FileAppender
to include the current process id by specifying the%processid
pattern in the File property.
<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.
我还找到一个SO answer。它有效。但是 %processid
属性 在启动时只初始化一次。在我的应用程序中,写作过程经常发生变化。所以这个解决方案不适合我。而且我猜它可以通过默认 log4net
布局设置来实现。
另一种选择是使用 type="log4net.Util.PatternString"
作为我的 conversionPattern
的类型。但它也不合适(如果我在 conversionPattern
中使用这种类型 - type="log4net.Util.PatternString"
- 那么 %threadId
、%level
甚至 %message
将打印为字符串常量)。
23/11/2018 16:22:52,456 PM 31560 [thread] level - message
但我需要 %threadId
和 %processid
在日志中。
您可以实现自定义 PatternLayoutConverter
输出进程 ID。
这样做,您不必设置和跟踪 运行 进程的 ID。
namespace PFX
{
class ProcessIdPatternLayoutConverter : PatternLayoutConverter
{
protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
Int32 processId = Process.GetCurrentProcess().Id;
writer.Write(processId);
}
}
}
然后您通过其完全限定的程序集名称在您的 Log4net
config 中引用此 PatternLayoutConverter
,如下所示。
<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>