我在.NET Core Service Fabric应用程序上使用Serilog。 我们注意到性能问题,经过调查后发现Serilog是罪魁祸首。
我们记录~2000个调试消息,需要10秒以上。 这甚至只配置了Console接收器并设置为仅在信息日志级别上过滤(因此不显示任何调试消息)。 将MinimumLevel设置为Information会使相同的代码运行<1秒(即使配置了接收器)。
我们的项目使用:
这是Serilog所期望的那种表现吗?
编辑:我注意到另一个(很多)较小的项目有相同的行为。这让我可以解决这个问题:我有一个自定义的富集程序正在检索ProcessId。打电话给Process.GetCurrentProcess()
是非常昂贵的。为每次记录调用执行此操作都会导致性能下降。我将进程Id存储在实例字段中,性能飙升。
过滤掉调试级事件与设置最低级别不同; Serilog可用于结构化日志数据的序列化,因此构建Debug
事件可能会耗费时间。
这可能表明您的调试日志记录存在问题 - Serilog本身很快,但如果您的调试事件正在序列化任意大的事情,例如请求/响应有效负载或DTO,您的应用程序最终将对您的对象进行大量反射,属性访问器调用(可能阻止,执行I / O和其他疯狂的事情),分配和垃圾回收。
如果调试事件使用无效的消息模板(即通过使用$"..."
字符串插值或非常量字符串进行记录),那么您的应用程序也将浪费大量精力解析这些作为格式字符串。
即并不是Serilog在这里很慢,但你的应用程序无意中让它做了大量浪费的工作。
使用Debug
然后在控制台接收器上使用后来的Information
过滤器将导致所有这些工作完成,然后扔掉。将最低级别设置为Information
将阻止此工作首先完成。
从长远来看,审核调试级日志记录以使用非常量消息模板,@
和destructureObjects: true
应该有助于使事情恢复到理智水平。