Serilog的目的是什么@
syntax?
如果我运行以下命令:
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}
to {@Dummy}
然后我得到相同的输出
Time: 16:22 [Level: Information] (ManagedThreadID: 8) Message: Dummy object: Foo: "Bar", Date: 06/25/2016 16:22:28 }
那么,什么是@
应该做的?
仔细观察,你会发现它不是相同的输出。
The @
Dummy 前面的运算符告诉 Serilog 序列化传入的对象,而不是使用转换它ToString()
,这就是您的第一个示例在不使用的情况下发生的情况@
操作员。
第一个示例中的日志事件将以如下属性结束(此处为 JSON):
{
"Dummy": "{ Foo = Bar, Date = 25/06/2016 16:20:30 }"
}
使用 {@Dummy} 将导致参数被序列化为结构化数据:
{
"Dummy":
{
"Foo": "Bar",
"Date": "25/06/2016 16:20:30"
}
}
尼古拉斯·布鲁姆哈特的评论 https://stackoverflow.com/a/24653956/211672(Serilog 的创建者):
在适当的情况下,使用@
运算符对于以下情况更有用
操纵/分析。
这种“选择加入”要求的原因是 .NET 中的大多数类型
程序很好地转换为字符串,但不干净/有意义
可序列化。通过选择使用 @ 进行序列化,您是在说:“我
知道我在做什么,序列化这个对象!”:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)