Serilog和ExpandoObject

3
如果我有以下这样的ExpandoObject对象:
dynamic d = new ExpandoObject();
d.x = "a";
d.y = "b";

并使用JsonFormatter将其记录在RollingFile中,例如:

_logger.Debug("{@d}", d);

它将被序列化为如下的JSON格式:

[{"_typeTag":"KeyValuePair`2","Key":"x","Value":"a"},{"_typeTag":"KeyValuePair`2","Key":"y","Value":"b"}]

如果我使用Newtonsoft.Json对ExpandoObject进行如下序列化:
JsonConvert.SerializeObject(d)

我会得到这个:
{"x":"a","y":"b"}

我该如何让Serilog生成与Newtonsoft.Json相同的JSON格式?
1个回答

6

添加:

.Destructure.ByTransforming<ExpandoObject>(e => new Dictionary<string,object>(e))

将其添加到您的LoggerConfiguration中即可。


谢谢Nicholas,这解决了RollingFile问题。是否还有一种方法可以修复控制台中的显示方式?我得到的是{["x"]="a", ["y"]="b"},最好是在键周围没有方括号。 - Andrew
还有一件事能否请您帮忙。如果我使用JsonConvert.DeserializeObject()反序列化一个JSON字符串"{\"x\":\"a\",\"y\":\"b\"}",得到的对象日志输出为[[[]],[[]]]。显然我期望得到的是{"x":"a","y":"b"} - Andrew
1
对于控制台,更新到最新的 Serilog.Sinks.Console 并使用其默认输出模板即可(对于文件,Serilog.Formatting.Compact 有一些更好的 JSON 格式化程序,顺便说一句)。要记录 JSON.NET 对象,请参见 https://github.com/destructurama/json-net。 - Nicholas Blumhardt
Nicholas非常感谢你!在你的帮助下,我现在已经解决了所有的格式问题。 - Andrew

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