什么是Serilog解构?

时间:2016-06-25 15:24:00

标签: .net logging serilog destructuring

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 }

那么,@应该做什么?

1 个答案:

答案 0 :(得分:7)

仔细观察,你会发现它的输出不同。

Dummy前面的if context == NSDraggingContext.OutsideApplication { return .None } else { // get the current global event object // and compare its modifier flags with ours if let event = NSApplication.sharedApplication().currentEvent where event.modifierFlags.contains(.AlternateKeyMask) { // ALT key is pressed return .Copy } // ALT key is not pressed return .Move } 运算符告诉Serilog序列化传入的对象,而不是使用@对其进行转换,这就是第一个示例中未使用ToString()的情况操作

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

@

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

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

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

  

在适当的情况下,使用{ "Dummy": { "Foo": "Bar", "Date": "25/06/2016 16:20:30" } } 运算符会更有用   操纵/分析

     

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