log4net进程标识信息

tel*_*all 30 log4net

我正在尝试创建一个涉及多台计算机上的多个进程的日志记录解决方案.我计划使用UDPAppender将所有日志消息发送到管理它们的单个机器.我有一些关于patterntrings和patternlayouts的问题.

因为我需要知道哪个机器以及该日志消息来自哪个进程,所以我也希望将其包含在日志中.我找到了主机名的%property {log4net:HostName},效果很好.但是,我在PatternLayouts中没有看到任何进程ID.当然,我在PatternString中看到类似的东西.来自FAQ:

<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)

但我不确定是否或如何混合和匹配这两者(或者即使这是规范的方式).

所以,我的问题是:

  1. PatternString和PatternLayout有什么区别?为什么两者都有?

  2. 我在PatternString中看到%processid,我如何在PatternLayout中获得相同的内容?这是我的测试布局:

    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] [%property{log4net:HostName}] %-5level %logger  - %message%newline" />
    </layout>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最后,将UDP布局用于UDP appender是有意义的.看起来XmlLayoutSchemaLog4j已经将HostNameProperty添加到XML消息中.如果我不想将这个新的进程ID(可能是进程名称)添加到XML消息中,那么最好的方法是什么?我应该只复制src\Layouts\XmlLayoutSchemaLog4j.cs,修改它,让log4net知道我创建了这个新的布局(比如SampleLayoutsApp)?

谢谢你的帮助

jvi*_*lta 48

您可以将所需的任何属性添加到GlobalContext.我使用此上下文来存储进程ID,如下所示:

log4net.GlobalContext.Properties["pid"] = Process.GetCurrentProcess().Id;
Run Code Online (Sandbox Code Playgroud)

然后使用常规模式从appender引用此属性,如下所示:

<layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %property{pid} %level %logger - %message%newline" />
</layout>
Run Code Online (Sandbox Code Playgroud)

您可以根据需要添加任意数量的属性,但由于它具有全局特性,因此最适合在应用程序执行期间不会更改的属性.


小智 17

您可以将PatternString提供给PatternLayout:

    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern type="log4net.Util.PatternString" value="%processid" />
    </layout>
Run Code Online (Sandbox Code Playgroud)

  • 请记住要转义要从事件中提取的属性的百分比字符,例如<conversionPattern type ="log4net.Util.PatternString"value ="%% utcdate&#9; %% - 5level&#9;%processid&#9;% %logger&#9; %% message %% newline"/>将进程ID包含为日志文件列之一 (5认同)