gpt4 book ai didi

json - log4net.ext.json - 可选属性

转载 作者:行者123 更新时间:2023-12-03 14:50:37 24 4
gpt4 key购买 nike

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

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

这是一个示例:我们有一个 HttpData 对象,用于记录对 Web 服务的入站和出站请求以及响应。在我们的 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>

SerializedLayout 足够智能,可以从 loggingEvent 属性中提取 HttpRoute 的值,并生成如下所示的 JSON:
{
...,
"HttpRoute": "/my/route/to/the/api",
...
}

太棒了!但是,当在 LoggingEvent 属性中找不到 HttpRoute 时,它​​会假定指定的字段是字符串文字,并生成以下内容:
{
...,
"HttpRoute": "HttpRoute",
...
}

这不太理想。

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

谢谢您的帮助。

最佳答案

我现在听到你了。

你有没有尝试过?

<member value="HttpRoute"/>

我在 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;
}

对您而言,快速解决方法是覆盖该方法并仅返回 Option ,不是 ?? Name :
    protected override bool GetDefaultValue(Core.LoggingEvent loggingEvent, out object obj)
{
obj = Option;
return true;
}

然后你需要在配置中声明你的新成员类型:
<member value="HttpRoute:HttpRoute" type="Your.Member"/>

如果您认为这应该是默认设置,让我们通过 enhancement 聊天。 .

关于json - log4net.ext.json - 可选属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34730847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com