启用调试日志级别时,Serilog会出现巨大的性能损失

问题描述 投票:4回答:1

我在.NET Core Service Fabric应用程序上使用Serilog。 我们注意到性能问题,经过调查后发现Serilog是罪魁祸首。

我们记录~2000个调试消息,需要10秒以上。 这甚至只配置了Console接收器并设置为仅在信息日志级别上过滤(因此不显示任何调试消息)。 将MinimumLevel设置为Information会使相同的代码运行<1秒(即使配置了接收器)。

我们的项目使用:

  • netcoreapp2.0
  • Serilog NuGet包2.8.0(最新)

这是Serilog所期望的那种表现吗?

编辑:我注意到另一个(很多)较小的项目有相同的行为。这让我可以解决这个问题:我有一个自定义的富集程序正在检索ProcessId。打电话给Process.GetCurrentProcess()是非常昂贵的。为每次记录调用执行此操作都会导致性能下降。我将进程Id存储在实例字段中,性能飙升。

.net-core serilog
1个回答
2
投票

过滤掉调试级事件与设置最低级别不同; Serilog可用于结构化日志数据的序列化,因此构建Debug事件可能会耗费时间。

这可能表明您的调试日志记录存在问题 - Serilog本身很快,但如果您的调试事件正在序列化任意大的事情,例如请求/响应有效负载或DTO,您的应用程序最终将对您的对象进行大量反射,属性访问器调用(可能阻止,执行I / O和其他疯狂的事情),分配和垃圾回收。

如果调试事件使用无效的消息模板(即通过使用$"..."字符串插值或非常量字符串进行记录),那么您的应用程序也将浪费大量精力解析这些作为格式字符串。

即并不是Serilog在这里很慢,但你的应用程序无意中让它做了大量浪费的工作。

使用Debug然后在控制台接收器上使用后来的Information过滤器将导致所有这些工作完成,然后扔掉。将最低级别设置为Information将阻止此工作首先完成。

从长远来看,审核调试级日志记录以使用非常量消息模板,@destructureObjects: true应该有助于使事情恢复到理智水平。

© www.soinside.com 2019 - 2024. All rights reserved.