我将在log4net
应用程序中使用wpf
。我需要日志中的消息如下所示:
11/8/2018 10:49:38 AM 13 (5368) properties disabled.
其中13
是processId
,它写了此消息。所以这很容易。但不幸的是我无法实现这一目标。因此,我只需要为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
。
答案 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>