isx*_*ker 3 .net c# logging log4net log4net-configuration
我将log4net在我的wpf申请中使用.我需要在我的日志中的消息如下所示:
11/8/2018 10:49:38 AM 13 (5368) properties disabled.
Run Code Online (Sandbox Code Playgroud)
其中13是processId其中写入该消息.所以这很容易.但不幸的是我无法做到这一点.所以我只需要一个适合我的log4net记录器的模式布局.
我在官方网站的faq部分找到了以下消息log4net:
以下示例
FileAppender通过%processid在File属性中指定模式来设置a的文件名以包括当前进程ID .
<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>
Run Code Online (Sandbox Code Playgroud)
所以,它的工作原理,但仅适用于我的日志文件中的文件名而不是布局.我需要把它%processid放到我的布局中.我目前的布局是:
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{dd/MM/yyyy HH:mm:ss,fff tt} %processid (%thread) - %message%newline" />
</layout>
Run Code Online (Sandbox Code Playgroud)
我的日志只是将processid字符串写入我的日志文件.
22/11/2018 16:21:51,863 PM processid (1) - Exiting application.
Run Code Online (Sandbox Code Playgroud)
我也找到了答案.它有效.但是%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
Run Code Online (Sandbox Code Playgroud)
但是我需要两个%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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后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>
Run Code Online (Sandbox Code Playgroud)