Serilog:{..}和{@ ..}之间的差异

use*_*862 3 .net serilog

鉴于此代码:

var d1 = new { x = 5, y = 88 };
Log.Logger.Information("{d1}", d1);
Log.Logger.Information("{@d1}", d1);
Run Code Online (Sandbox Code Playgroud)

如何在两个Log.Logger.Information(...)行中以不同方式记录d1中的对象?换句话说,在{}之间添加@的影响是什么?

我在"保留对象结构"标题下阅读了https://github.com/serilog/serilog/wiki/Structuredvals,但这对我来说没有意义.

Nic*_*rdt 5

{d1}将无法识别的类型(如匿名类型)转换为strings进行日志记录,即使用ToString().因此,第一个示例中的日志事件最终将使用类似的属性(此处为JSON):

{
  "d1": "{ x = 5, y = 88 }"
}
Run Code Online (Sandbox Code Playgroud)

使用{@d1}将导致参数序列化为结构化数据:

{
  "d1":
  {
    "x": 5,
    "y": 88
  }
}
Run Code Online (Sandbox Code Playgroud)

在适当的情况下,第二个例子对于操作/分析更有用.

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