我们使用Serilog生成json日志(即每个日志条目都是json,而不是文本)。好处是它们可以包含对象。我用它来记录C#异常对象,例如:
ILogger.Error("Something bad happened. {@exception}", exception);
这会将exception
对象的所有属性发送到日志。 (变量exception
的类型为Exception
。)
现在我很困惑,为什么没有一个简单的比喻说如何在浓缩器中做到这一点。当前,我们以这种方式添加异常以登录Richer:
LogEvent.AddPropertyIfAbsent(new LogEventProperty("exception", new ScalarValue(exception));
当然,ScalarValue
将异常转换为字符串。看起来像双引号(“ stringified json”)中的json对象。
现在,问题在于,当我们将其放入ELK(一种用于监视日志并让我们在其中进行搜索的软件)时,它抱怨exception
字段的类型不同,并说应该对象,而不是字符串。 (这是另一个主题-我发现了很多重复的问题,如何在ELK中“解决”它。但是显然,它不能在ELK中“修复”,它应该始终以相同的格式产生。所以这就是为什么我问这个问题。 )
在Serilog中看不到ScalarValue
的任何基于对象的类比。 AddPropertyIfAbsent
不直接接受对象,它希望LogEventProperty
与LogEventPropertyValue
一起使用。这个抽象类有一些实现,包括简单的值,数组和字典,但是似乎没有一个像@exception
那样发出对象。因此,我想知道Serilog是否涵盖了这种非常普遍且基本的情况,还是我只是盲目?
答案 0 :(得分:1)
您的浓缩器接受ILogEventPropertyFactory
。你可以做
logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("User", userDetails,
destructureObjects: true));
,它将使用自定义对象丰富它。