3

鉴于此代码:

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

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

我在“保留对象结构”标题下阅读了https://github.com/serilog/serilog/wiki/Structured-Data,但这对我来说没有意义。

4

1 回答 1

6

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

{
  "d1": "{ x = 5, y = 88 }"
}

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

{
  "d1":
  {
    "x": 5,
    "y": 88
  }
}

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

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

于 2014-07-09T12:39:39.897 回答