【问题标题】:Serilog: How to log object in enricher?Serilog:如何在浓缩器中记录对象?
【发布时间】:2019-05-16 16:46:19
【问题描述】:

我们使用 Serilog 生成 json 日志(即每个日志条目都是 json,而不是文本)。好处是它们可以包含对象。例如,我用它来记录 C# 异常对象,如下所示:

ILogger.Error("Something bad happened. {@exception}", exception);

这会将exception 对象的所有属性发送到日志。 (这里的变量exceptionException 类型。)

现在我很困惑为什么没有简单的类比如何在浓缩器中做到这一点。目前,我们通过这种方式为登录丰富器添加异常:

LogEvent.AddPropertyIfAbsent(new LogEventProperty("exception", new ScalarValue(exception));

当然,ScalarValue 会将异常转换为字符串。它看起来像双引号内的 json 对象(“字符串化 json”)。

现在,问题是当我们把它放到 ELK(一个监控日志并让我们在其中搜索的软件)时,它抱怨 exception 字段的类型不同,它说它应该是对象那是以前,不是字符串。 (这是另一个话题——我发现了许多重复的问题,如何在 ELK 中“解决”它。但显然,它不能在 ELK 中“修复”,它应该始终以相同的格式生成。所以这就是我问这个问题的原因。 )

我在 Serilog 中看不到 ScalarValue 的任何基于对象的类比。 AddPropertyIfAbsent 不直接接受对象,它需要LogEventPropertyLogEventPropertyValue。这个抽象类有一些实现,包括简单的值、数组和字典,但它们似乎都不像@exception那样发出对象。所以我想知道Serilog是否没有涵盖这种非常常见和基本的场景,还是我只是瞎了眼?

【问题讨论】:

  • 附带说明,您应该真正遵循标准约定与您的变量大小写,所以它不会混淆其他人。局部变量和方法参数应该是驼峰式(LogEvent -> logEvent),Serilog 中的属性名应该大写(@exception -> @Exception)。当然,Serilog 有一个专门的方法来记录异常,logger.Error(exception "Something bad happened"); 你可以使用它。
  • @mason 我试图将异常作为第一个参数,但这只会向日志发出一条短消息。我们使用自定义异常并希望它们的属性在日志中也可见。
  • 那么您可能需要查看Serilog.Exceptions,它将捕获自定义异常属性。

标签: logging elastic-stack serilog


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多