我们使用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对象的根目录?
谢谢您的帮助.