【问题标题】:What is Serilog destructuring?什么是 Serilog 解构?
【发布时间】:2016-10-28 01:15:06
【问题描述】:

Serilog 的@ 语法的目的是什么?

如果我运行以下命令:

var dummy = new { Foo = "Bar", Date = DateTime.Now };

Log.Information("Dummy object: {Dummy}", dummy);

然后我得到一个输出到控制台,如下所示:

Time: 16:20 [Level: Information] (ManagedThreadID: 8) Message: Dummy object: "Foo = Bar, Date = 25/06/2016 16:20:30 }"

如果我将{Dummy} 更改为{@Dummy},那么我会得到相同的输出

Time: 16:22 [Level: Information] (ManagedThreadID: 8) Message: Dummy object:  Foo: "Bar", Date: 06/25/2016 16:22:28 }

那么,@ 应该做什么?

【问题讨论】:

    标签: .net logging serilog destructuring


    【解决方案1】:

    仔细看,你会发现它不是同一个输出。

    Dummy 前面的 @ 运算符告诉 Serilog 对传入的对象进行序列化,而不是使用 ToString() 对其进行转换,这在您的第一个示例中没有使用 @ 运算符时会发生这种情况。


    您在第一个示例中的日志事件将以如下属性结束(此处为 JSON):

    {
      "Dummy": "{ Foo = Bar, Date = 25/06/2016 16:20:30 }"
    }
    

    使用 {@Dummy} 会导致参数被序列化为结构化数据:

    {
      "Dummy":
      {
        "Foo": "Bar",
        "Date": "25/06/2016 16:20:30"
      }
    }
    

    Comment from Nicholas Blumhardt(Serilog 的创建者):

    在适当的情况下,使用@ 运算符对 操作/分析。

    这种“选择加入”要求的原因是 .NET 中的大多数类型 程序很好地转换成字符串,但不是干净/有意义 可序列化的。通过选择使用 @ 进行序列化,您是在说:“我 知道我在做什么,序列化这个对象!” :)

    【讨论】:

    • 是的!当你 ToString() 一个匿名类型时,你会得到一个序列化的表单。
    • @BanksySan 有点... ToString() 在匿名类型上仍然给你一个字符串,它看起来不错。 @ 远不止于此,因为它为接收器提供了序列化对象,接收器可以用它做任何事情,包括存储序列化数据。尝试将 Serilog 与 Seq (getseq.net) 结合使用,看看 @ 运算符的强大程度。
    猜你喜欢
    • 2021-04-22
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2014-08-20
    相关资源
    最近更新 更多