【问题标题】:Can Serilog destructure complex objects passed to BeginScope?Serilog 可以解构传递给 BeginScope 的复杂对象吗?
【发布时间】:2020-01-15 10:04:24
【问题描述】:

我正在使用 Serilog.Extensions.Logging 并使用此 outputTemplate 输出到控制台:

"{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 它应该解构复杂类型。

【问题讨论】:

    标签: serilog microsoft-extensions-logging


    【解决方案1】:

    如果键以@ 字符为前缀,复杂类型将被解构。 所以:

    using (logger.BeginScope(new Dictionary&lt;string, object&gt; { { "@Data", data } }))

    成功了 :-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 2017-10-09
      • 2014-01-06
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      相关资源
      最近更新 更多