2014-07-05 145 views
3

鉴于此代码:Serilog:之间{..} {差异@ ..}

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”标题下的“保留对象结构”,但这对我没有意义。

+0

实际上有'{..}'(默认),'{$ ..}'(stringify)和'{@ ..}'(结构)。是[this](https://github.com/serilog/serilog/blob/60e8120a12abee4db942d2ff03b123341fab1fff/src/Serilog/Parsing/Destructuring.cs)*也许*有更多帮助? –

+0

这并没有为我清除它。 “default”和“destructure”似乎都将对象存储为结构化对象,而不是字符串。我很欣赏有一个区别,但看不到它。 – user1147862

+0

方便的是,有人刚刚写了一个很好的Pluralsight课程来解释这个:http://pluralsight.com/training/Courses/TableOfContents/modern-structured-logging-serilog-seq –

回答

5

{d1}将无法​​识别的类型(如匿名的类型)转换为strings进行日志记录,即使用ToString()。因此,在第一个例子你的日志事件将最终像(在这里JSON)属性:

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

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

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

在适当的地方,第二个例子对于操纵/分析更有用。

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

+0

如果对象有一个公共属性是型号列表?我看到Serilog正在解构对象,并列出了所有的double和integer属性,但是遗留了这个List类型的属性。 – NotAgain

+0

@NotAgain有可能这个列表是一个公共领域,而不是一个属性? Serilog忽略领域,所以这是一种可能性。如果没有 - 你可以在新的问题中发布你的代码吗?干杯! –

+0

现货。这是一个领域,而不是一个财产。我的错。 – NotAgain