在日志中为 log4net ext json 配置自定义 Appname

问题描述

我使用 log4net.ext.json 登录 wcf 类库,但没有 exe。但是我想给 appname 一些别名,例如CarService 而不是 /LM/W3SVC/2/ROOT-1-132599327970820414。我该如何配置?

当前配置:

<log4net>
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <encoding value="UTF-8" type="System.Text.UTF8Encoding" />
    <file type="log4net.Util.PatternString" value="C:\Logs\WcfLibrary.log" name ="RollingLogFileAppender" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <countDirection value="-1"/>
    <datePattern value="yyyy-MM-dd"/>
    <logName value="Myapp" />
    <applicationName value="BmwService" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.SerializedLayout,log4net.Ext.Json">
      <member value="logDateTime%date:yyyy-MM-dd HH:mm:ss:ffff" />
      <decorator type="log4net.Layout.Decorators.StandardTypesDecorator,log4net.Ext.Json" />
      <member value="hostName" />
      <default />
      <remove value="date" />
      <remove value="ndc" />
      <remove value="message" />
      <remove value="thread" />
      <remove value="exception" />
      <member value="logData:messageObject" />
    </layout>
  </appender>
  <root>
    <level value="All"/>
    <appender-ref ref="RollingLogFileAppender"/>
  </root>
</log4net>

我收到以下日志:

{"logDateTime":"2021-03-11","hostName":"PC","level":"DEBUG","appname":"/LM/W3SVC/2/ROOT-1-132599327970820414","logger":"Service","logData":{"Message":"Service started","ClassName":"Utils","MethodName":"Start"}}

预期的日志是:

{"logDateTime":"2021-03-11","appname":"CarService","MethodName":"Start"}}

解决方法

查看各种 context objects in log4net。您将在第一次日志记录调用之前设置它(可能在构造函数中或在初始化期间)。它会在您的线程调用的整个生命周期中持续存在,如果您在线程之外,您只需要再次设置它。如果您已经为记录器实现了一个包装库,您还可以根据您公开的某些参数将其设置在那里。

ThreadContext.Properties["appname"] = "CarService"

设置后,您应该能够在您的 appender 配置或映射中引用“appname”。

此外,如果您尝试获取应用程序的实际名称,并且在您的 IIS 站点名称中反映了该名称,您可以使用“HostingEnvironment.SiteName”传递到线程上下文中。