首页 > 解决方案 > JObject/JToken 不登录 NLog

问题描述

我有一个类并且一些属性是动态的,当我的类传递给某个动作 API 时,该方法无法理解为 JObject,问题是登录 NLOG,当我尝试这样做时,我的属性中的日志动态显示“[]”示例如下:

myProperty:[

    [[]],
    [],
    []
]

当我尝试将整个班级 Objet 转换为 JObject(Newtonsoft) 时,我的所有日​​志都将 [] 如下所示:

{ "time": "2019-05-13 18:12:16.2224", "level": "DEBUG", "JsonProperties": { "log": [[[[[]],[[]],[[]],[[[[]],[[]],[[]]]],[[[[[[[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]]]]],[[[[]],[[]],[[]],[[]],[[]],[[[[]],[[]],[[]]]],[[[[[]],[[]]],[[[]],[[]]]]],[[[[[]],[[]],[[]]],[[[]],[[]],[[]]]]],[[[[[]],[[]]],[[[]],[[]]]]]]]]]]]],[[[[[]],[[]],[[]],[[[[]],[[]],[[]],[[]]]]]]]] }, "message": "Testando performance no LoggerGenerator.", "log": [[],[]] }

我解决了这个问题,将 JObject 转换为 Dictionary 并完美地工作,问题是这样做的开销。

我需要在不创建自己的方法并转换为 Dictionary 的情况下解决这个问题

谢谢。

标签: c#asp.netnlog

解决方案


JObject是一个IEnumerable,NLog 会尝试枚举它。

您可以执行以下操作:

logger.Info("Hello {0}", jObject); // No structured logging, becomes string.Format

logger.Info("Hello {$myobj}", jObject); // Structured logging that forces JObject.ToString

logger.Info("Hello {myobj}", jObject.ToString()); // Converts to string upfront

您还可以通过覆盖这些来自定义 NLog 如何处理特殊对象(如 JObject):

  • NLog.Config.ConfigurationItemFactory.Default.ValueFormatter
  • NLog.Config.ConfigurationItemFactory.Default.JsonConverter

推荐阅读