【发布时间】:2019-08-13 05:48:18
【问题描述】:
我在 .NET Core Service Fabric 应用程序上使用 Serilog。
我们注意到了性能问题,经过调查发现 Serilog 是罪魁祸首。
我们记录了大约 2,000 条调试消息,这需要 10 多秒。
即使仅配置了控制台接收器并将其设置为仅在信息日志级别进行过滤(因此不显示任何调试消息),也是如此。
将 MinimumLevel 设置为 Information 会使相同的代码运行不到 1 秒(即使配置了接收器)。
我们的项目使用:
- netcoreapp2.0
- Serilog NuGet 包 2.8.0(最新)
这是 Serilog 所期望的性能吗?
编辑:我注意到另一个(很多)较小的项目有相同的行为。这使我能够隔离问题:我有一个正在检索 ProcessId 的自定义浓缩器。拨打Process.GetCurrentProcess() 非常昂贵。对每个日志调用都这样做是导致性能下降的原因。我将进程 ID 存储在实例字段中,性能飙升。
【问题讨论】:
-
您可以使用
Log.IsEnabled使您的日志语句有条件。我很确定 select 没有损坏 wrt serilog - 我和许多其他人有很多调试日志记录,没有这样的影响。说了这么多,如果您通过控制台接收器发送大量消息并且它们没有被过滤掉,那么写入(如果没有包含在 Serilog.Sinks.Async 中)将影响您的主线处理的性能(但您似乎排除)