c# - 如何将 processid 添加到 log4net 布局?
问题描述
我将log4net
在我的wpf
应用程序中使用。我需要日志中的消息如下所示:
11/8/2018 10:49:38 AM 13 (5368) properties disabled.
在哪里写这条消息13
。processId
所以这很容易。但不幸的是,我无法做到这一点。所以我只需要为我的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"
在conversionPattern
then中使用这种类型 - %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);
}
}
}
然后,您可以通过其完全限定的程序集名称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>
推荐阅读
- python - 从子文件夹而不是同一目录导入模块?
- java - 从 ListView 获取所有 Edittext 值
- javascript - ReplaySubject it is not updating the array when new object is added Angular
- java - 限制 TextField 的文本区域(边距/填充)
- django - 如何使用 Django 中的 slug 查询演员所属的所有电影?
- python - Python - 如何使用 super( 访问父类中的实例属性
, 自己)? - abap - 使用动态方法名称调用方法,RuntimeException
- date - 如何在 BigQuery 中获取 mmm-yy?
- json - json中的python排序元素
- javascript - 如何正确填充此下拉列表?