【问题标题】:How to make NLog's JsonLayout output object types?如何制作 NLog 的 JsonLayout 输出对象类型?
【发布时间】:2019-10-25 15:14:26
【问题描述】:

我正在使用 NLog 和 JsonLayout 布局记录我的应用程序的数据。我为我的对象获得的输出不包括类型,我希望它与 JSON 的其余部分一起记录类型。我正在记录的集合具有各种类型的项目,我希望日志能够明确说明这些项目是什么,而读者不必根据其属性推断它是哪种类型。

这就是我得到的

"things": [
    [
        {
            "PropertyA": 1,
            "PropertyB": 2,
        }
    ],
    [],
    []
]

我想记录的是 JSON.Net 的输出:

"things": [
    [
        {
            "$type": "MyNamespace.MyObject, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1234567890123456",
            "PropertyA": 1,
            "PropertyB": 2,
        }
    ],
    [],
    []
]

我如何实现这一目标?如果还有其他同样好的方法,我不会使用 JsonLayout。

【问题讨论】:

标签: c# json logging nlog


【解决方案1】:

NLog 自动为异常对象注入类型属性。但是您可以覆盖 NLog IJsonConverter,这样所有对象都会发生这种情况:

您可以像这样覆盖 JSON 转换:

internal class JsonLogTypeSerializer : NLog.IJsonConverter
{
    private NLog.IJsonConverter _originalConverter;
    public JsonLogModelSerializer(NLog.IJsonConverter originalConverter)
    {
        _originalConverter = originalConverter;
    }

    /// <summary>Serialization of an object into JSON format.</summary>
    /// <param name="value">The object to serialize to JSON.</param>
    /// <param name="builder">Output destination.</param>
    /// <returns>Serialize succeeded (true/false)</returns>
    public bool SerializeObject(object value, System.Text.StringBuilder builder)
    {
        if ( Convert.GetTypeCode(value) == TypeCode.Object
          && !(value is Exception)
          && !(value is IFormattable)
          && !(value is IEnumerable)
          && !value.GetType().IsValueType)
        {
            builder.Append("\"Type\": \"").Append(value.GetType().ToString()).Append("\" ");
        }

        return _originalConverter.SerializeObject(value, builder);
    }
}

然后你可以激活特殊的JsonConverter:

var oldJsonConverter = NLog.Config.ConfigurationItemFactory.Default.JsonConverter;
var newConverter = new JsonLogTypeSerializer(oldJsonConverter);
NLog.Config.ConfigurationItemFactory.Default.JsonConverter = newConverter;

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2022-01-17
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多