log4net.ext.json - 可选属性

Ant*_*sso 5 log4net json

我们使用log4net.ext.json将日志序列化为JSON格式的文件.但是,我无法弄清楚如何将可选字段添加到json对象的根目录,而不向不显示该数据的日志添加不必要的数据.让我解释:

我们有几种不同类型的日志,每种日志都有自己的自定义渲染器和日志对象.我们想要的是让这些对象的数据出现在JSON对象的基础中,因为它符合我们的多平台日志记录标准.

这是一个例子:我们在记录入站和出站请求以及对Web服务的响应时使用了一个HttpData对象.在我们的appender中,我们获取HttpData对象并将其属性值(例如HttpRoute字段)放入LoggingEvent属性对象中.

然后我们按如下方式配置appender:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="D:\log.txt"/>
  <rollingStyle value="Size"/>
  <maxSizeRollBackups value="10"/>
  <maximumFileSize value="100MB"/>
  <AppendToFile value="true"/>
  <layout type="log4net.Layout.SerializedLayout, log4net.Ext.Json">
    ...
    <member value="HttpRoute:HttpRoute"/>
    ...
  </layout>
</appender>
Run Code Online (Sandbox Code Playgroud)

SerializedLayout非常智能,可以从loggingEvent属性中提取HttpRoute的值,并生成如下所示的JSON:

{
  ...,
  "HttpRoute": "/my/route/to/the/api",
  ...
}
Run Code Online (Sandbox Code Playgroud)

太棒了!然而,当HttpRoute是在LoggingEvent所属性中找到,它然后假定该指定字段是一个字符串,并产生这样的:

{
  ...,
  "HttpRoute": "HttpRoute",
  ...
}
Run Code Online (Sandbox Code Playgroud)

这不太理想.

有没有办法让HttpRoute只在日志记录事件属性中有值时出现?或者是否有另一种方法可以将日志记录对象中的字段输出到已记录的JSON对象的根目录?

谢谢您的帮助.

Rbj*_*bjz 1

我现在听到你的声音了。

你有没有尝试过?

<member value="HttpRoute"/>
Run Code Online (Sandbox Code Playgroud)

我在Member.cs中找到了罪魁祸首:

    /// <param name="loggingEvent">the event to get value from</param>
    /// <param name="obj">value found</param>
    /// <returns>success of finding a NestedLayout not null</returns>
    protected virtual bool GetDefaultValue(Core.LoggingEvent loggingEvent, out object obj)
    {
        obj = Option ?? Name;
        return true;
    }
Run Code Online (Sandbox Code Playgroud)

您的快速解决方法是重写该方法并仅返回Option,而不是?? Name

    protected override bool GetDefaultValue(Core.LoggingEvent loggingEvent, out object obj)
    {
        obj = Option;
        return true;
    }
Run Code Online (Sandbox Code Playgroud)

然后您需要在配置中声明新的成员类型:

<member value="HttpRoute:HttpRoute" type="Your.Member"/>
Run Code Online (Sandbox Code Playgroud)

如果您认为这应该是默认设置,让我们讨论一下增强功能