JSON 字符串应记录为结构化数据,而不仅仅是字符串

问题描述 投票:0回答:1

我希望 JSON 字符串应记录为结构化数据,而不仅仅是字符串。

像这样

var data = "{\"key1\": \"value1\", \"key2\": \"value2\"}";
using (LogContext.PushProperty("data", data))
{
   _logger.LogInformation("balabala");
}
// output: {"@t":"2024-01-17T02:58:00.6737234Z","@m":"balabala","@i":"089ce129","data":{"key1":"value1","key2":"value2","$type":"xxxx"}}

我尝试将 JSON 转换为字典。

有办法做到这一点吗?

c# serilog
1个回答
0
投票

JSON 字符串应记录为结构化数据,而不仅仅是字符串

我尝试将 JSON 转换为字典。

有办法做到这一点吗?

是的,根据您的场景和要求,是的,您可以通过将 JSON 字符串转换为字典,然后将其记录为结构化数据来实现这一点。 您可以使用像

Newtonsoft.Json
这样的流行库将 JSON 字符串反序列化为字典,然后将字典记录为结构化数据。

为了实现这一点,您可以执行以下操作:

首先,您需要将 JSON

JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonString)
字符串转换为字典。 然后,使用
LogContext.PushProperty
方法将数据属性及其字典值推送到日志记录上下文中。 A 最后一个参数(true)表示该值应呈现为结构化数据。

让我们看看实践:

var jsonData = "{\"key1\": \"value1\", \"key2\": \"value2\"}";

var dataDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonData);

using (LogContext.PushProperty("data", dataDictionary, true))
{
    _logger.LogInformation("balabala");
}

或者,您甚至可以使用

JObject.Parse(jsonData)
库来使用
Newtonsoft.Json

var parsedData = JObject.Parse(jsonData);

using (LogContext.PushProperty("data", parsedData))
{
    _logger.LogInformation("balabala");
}

注意: 如果您有 JSON 数据的强类型表示,请直接使用它,而不是解析到字典中。这提供了更好的类型安全性和潜在的性能优势。此外,对于复杂的场景,您可以创建自定义序列化器来微调输出格式。

© www.soinside.com 2019 - 2024. All rights reserved.