What is Serilog destructuring?

微笑、不失礼 提交于 2020-12-03 06:27:18

问题


What is the purpose of Serilog's @ syntax?

If I run the following:

var dummy = new { Foo = "Bar", Date = DateTime.Now };

Log.Information("Dummy object: {Dummy}", dummy);

Then I get an output to the console like so:

Time: 16:20 [Level: Information] (ManagedThreadID: 8) Message: Dummy object: "Foo = Bar, Date = 25/06/2016 16:20:30 }"

If I change the {Dummy} to {@Dummy} then I get the same output

Time: 16:22 [Level: Information] (ManagedThreadID: 8) Message: Dummy object:  Foo: "Bar", Date: 06/25/2016 16:22:28 }

So, what is the @ supposed to do?


回答1:


Look closely, and you'll see that it is not the same output.

The @ operator in front of Dummy tells Serilog to serialize the object passed in, rather than convert it using ToString(), which is what happens on your first example without using the @ operator.


Your log event in the first example will end up with a property like (here in JSON):

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

Using {@Dummy} will cause the parameter to be serialized as structured data:

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

Comment from Nicholas Blumhardt (creator of Serilog):

Where appropriate, using the @ operator is much more useful for manipulation/analysis.

The reason for this "opt-in" requirement is that most types in .NET programs convert nicely into strings, but aren't cleanly/meaningfully serializable. By opting in to serialization with @ you're saying: "I know what I'm doing, serialize this object!" :)



来源:https://stackoverflow.com/questions/38029980/what-is-serilog-destructuring

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!