Serilog 能否解构传递给 BeginScope 的复杂对象?
Can Serilog destructure complex objects passed to BeginScope?
我正在使用 Serilog.Extensions.Logging 并使用此输出模板输出到控制台:
"{Timestamp:HH:mm} [{Level:u3}] {Message} {Properties:j} {NewLine}"
我希望看到的是,通过 BeginScope
设置的复杂对象被解构为 Properties
。相反,似乎使用了类型名称。
var data = new Data { Id = 42, Name = "Hitchhiker" };
using (logger.BeginScope(new Dictionary<string, object> { { "Data", data } }))
{
logger.LogInformation("Hello world!");
}
结果是:
10:40 [INF] Hello world! {"SourceContext": "ConsoleApp3.Program", "Data": "ConsoleApp3.Data"}
我想要的是:
10:40 [INF] Hello world! {"SourceContext": "ConsoleApp3.Program", "Data": { "Id" = 42, "Name" = "Hitchhiker"} }
我是否缺少配置设置,或者这根本不可能?
编辑
刚刚注意到这可以通过 vanilla Serilog 完成:
var dataLogger = logger.ForContext("Data", data, true);
这里最后一个参数通知 Serilog 它应该解构复杂类型。
如果键以 @
字符为前缀,复杂类型将被解构。
所以:
using (logger.BeginScope(new Dictionary<string, object> { { "@Data", data } }))
有用:-)
我正在使用 Serilog.Extensions.Logging 并使用此输出模板输出到控制台:
"{Timestamp:HH:mm} [{Level:u3}] {Message} {Properties:j} {NewLine}"
我希望看到的是,通过 BeginScope
设置的复杂对象被解构为 Properties
。相反,似乎使用了类型名称。
var data = new Data { Id = 42, Name = "Hitchhiker" };
using (logger.BeginScope(new Dictionary<string, object> { { "Data", data } }))
{
logger.LogInformation("Hello world!");
}
结果是:
10:40 [INF] Hello world! {"SourceContext": "ConsoleApp3.Program", "Data": "ConsoleApp3.Data"}
我想要的是:
10:40 [INF] Hello world! {"SourceContext": "ConsoleApp3.Program", "Data": { "Id" = 42, "Name" = "Hitchhiker"} }
我是否缺少配置设置,或者这根本不可能?
编辑
刚刚注意到这可以通过 vanilla Serilog 完成:
var dataLogger = logger.ForContext("Data", data, true);
这里最后一个参数通知 Serilog 它应该解构复杂类型。
如果键以 @
字符为前缀,复杂类型将被解构。
所以:
using (logger.BeginScope(new Dictionary<string, object> { { "@Data", data } }))
有用:-)