Serilog:{..}和{@..}的区别

4

考虑以下代码:

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

两个Log.Logger.Information(...)行中,d1中的对象将如何有所不同?

换句话说,在{ }之间添加@的效果是什么?

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


实际上,有三种不同的方式可以使用花括号:{..}(默认),{$..}(字符串化)和{@..}(解构)。这个 链接 或许 更有帮助? - user824425
这对我来说并没有澄清问题。无论是“default”还是“destructure”,似乎都将对象存储为结构化对象,而不是字符串。我知道它们之间有区别,但我看不出来。 - user1147862
方便的是,有人刚好写了一门很棒的Pluralsight课程来解释这个问题:http://pluralsight.com/training/Courses/TableOfContents/modern-structured-logging-serilog-seq - Nicholas Blumhardt
1个回答

8

{d1}会将无法识别的类型(例如这里的匿名类型)转换为字符串以进行日志记录,即使用ToString()。因此,第一个示例中的日志事件将以以下属性结束(在此处以JSON格式显示):

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

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

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

如果适用的话,第二个例子更适合于操作/分析。

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


如果对象具有一个类型为List<int>的公共属性,Serilog会对对象进行解构,并列出所有类型为double和integer的属性,但会省略这个特定类型为List的属性。 - NotAgain
@NotAgain,列表是否可以是公共字段而不是属性?Serilog会忽略字段,这是一个可能性。如果不行的话,你能否在一个新问题中发布你的代码?干杯! - Nicholas Blumhardt
非常准确。它是一个字段而不是属性。我的错误。 - NotAgain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接