使用 JSON 格式化程序登录到控制台时,日志消息不再在日志输出中重复。 以前,消息通常出现三次:一次作为顶级 Message消息,再次出现在对象中 State ,第三次显示为原始格式字符串。
引入的版本
.NET 10
以前的行为
以前,使用配置了 JSON 格式化程序的控制台记录器时,输出中会复制日志消息。 例如,代码 logger.LogInformation("This is an information message."); 生成了以下输出:
{
"EventId": 0,
"LogLevel": "Information",
"Category": "Program",
"Message": "This is an information message.",
"State": {
"Message": "This is an information message.",
"{OriginalFormat}": "This is an information message."
}
}
可以看到, Message 显示两次:一次作为顶层 Message ,一次又一次显示在对象内部 State 。
新行为
从 .NET 10 开始, Message 仅显示在顶层,而不是在对象内部 State (通常)。 日志输出如下所示:
{
"EventId": 0,
"LogLevel": "Information",
"Category": "Program",
"Message": "This is an information message.",
"State": {
"{OriginalFormat}": "This is an information message."
}
}
破坏性变更的类型
此更改为行为更改。
更改原因
此更改的目标是通过消除重复内容来减少不必要的日志记录开销。 通过避免重复设置同一消息的格式,更改有助于:
- 最小化日志输出大小。
- 减少冗余信息导致的混淆。
- 通过阻止对同一消息执行多个格式设置作来提高性能。
总的来说,这会导致更简洁、更高效、更易于读取的日志。
建议的措施
之前如果分析过日志输出并从State对象中提取Message,现在由于已去除重复内容,可以安全地使用顶层Message。
注释
在某些情况下,Message可能仍然会出现在State对象中。 当其内容与顶级 Message内容不同时,通常会发生这种情况。
受影响的 API
- Microsoft.Extensions.Logging.ConsoleLoggerExtensions.AddConsole
- Microsoft.Extensions.Logging.ConsoleLoggerExtensions.AddConsoleFormatter
- Microsoft.Extensions.Logging.ConsoleLoggerExtensions.AddJsonConsole
- Microsoft.Extensions.Logging.ConsoleLoggerExtensions.AddSimpleConsole
- Microsoft.Extensions.Logging.ConsoleLoggerExtensions.AddSystemdConsole