Serilog.Sinks.Console sink 是否从包装到 Serilog.Sinks.Async sink 中获得任何好处?

Does Serilog.Sinks.Console sink get any benefits from wrapping to Serilog.Sinks.Async sink?

我在我的 aspnet 核心应用程序中使用 Serilog 进行日志记录。而且我需要非常频繁地向控制台写入日志事件(每秒 300-500 个事件)。我 运行 我的应用程序在 docker 容器中,并使用编排工具处理控制台日志。

所以我的问题是:我应该为我的 Console 接收器使用 Async 包装器吗?我会从中得到任何好处吗? 我阅读了文档 (https://github.com/serilog/serilog-sinks-async),但无法理解 Console 接收器是否真实。

Async 接收器获取已经捕获的 LogEvent 项目,并使用 ConcurrentQueue Producer/Consumer 集合将它们从多个前台线程转移到单个后台处理器。一般来说,对于稳定的吞吐量尤其是事件吞吐量来说,这是一件好事。

此外,如果发送到 >1 个接收器,如果您有足够的可用内核,则转移到后台线程,该线程将根据需要安排并专注于该工作负载(即,传播到缓存中的接收器的路径)可能会很好 and/or 下沉甚至会暂时阻塞。

话虽如此,基于此信息的任何内容都是不成熟的优化。


如果您不在前面放置 Async,控制台接收器及其高效摄取而不会阻塞的能力,总是取决于很多 - 例如,托管环境通常会合成一个 stdout 来缓冲有效率的。当它运行良好时,在控制台接收器前面添加一个 Async 只会延长对象的生命周期,与允许每个线程直接提交到控制台接收器相比没有太大好处。


因此,这取决于 - IME 将所有内容提供给 Async 并在那里进行所有处理(例如写入缓冲文件,发出每个 .5s(可能发送到转发到您的日志的边车进程商店))可以很好地工作。最重要的是,一个好的负载生成器装置对于任何高吞吐量应用程序都是非常有用的。一旦你有了一个,你就可以进行实验——我已经看到通过重新组织完全相同的输出以及它的调度方式,吞吐量提高了 30%(诚然,我在那个过渡期间也切换到了 Serilog——你不太可能看到任何这样的顺序)。