Serilog:如何在richer中记录对象?

时间:2019-05-16 16:46:19

标签: logging elastic-stack serilog

我们使用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不直接接受对象,它希望LogEventPropertyLogEventPropertyValue一起使用。这个抽象类有一些实现,包括简单的值,数组和字典,但是似乎没有一个像@exception那样发出对象。因此,我想知道Serilog是否涵盖了这种非常普遍且基本的情况,还是我只是盲目?

1 个答案:

答案 0 :(得分:1)

您的浓缩器接受ILogEventPropertyFactory。你可以做

logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("User", userDetails, 
                                                            destructureObjects: true));

,它将使用自定义对象丰富它。