如何监控Serilog的AmazonKinesis Sink中缓冲的未处理日志?
解决方案
1. 利用Sink内置的Flush机制(推荐)
Serilog的AmazonKinesisSink基于PeriodicBatchingSink实现,调用Logger.Dispose()时会自动同步执行Flush操作,等待所有缓冲日志发送至Kinesis。若需在Dispose前主动确认状态,可手动调用FlushAsync并等待完成:
// 提前实例化Sink并保留引用 var kinesisSink = new KinesisSink(options, kinesisClient); var logger = new LoggerConfiguration() .WriteTo.Sink(kinesisSink) .CreateLogger(); // 业务代码中使用logger记录日志... // 主动触发Flush并等待所有缓冲日志发送完成 await kinesisSink.FlushAsync(CancellationToken.None); // 此时缓冲已排空,执行Dispose logger.Dispose();
2. 反射访问内部缓冲队列(不推荐,依赖内部实现)
若需直接查看缓冲中的事件数量,可通过反射获取PeriodicBatchingSink的内部队列字段。注意:该方法依赖Sink的私有实现,版本更新可能导致失效:
using System.Reflection; using System.Collections.Concurrent; using Serilog.Sinks.PeriodicBatching; // ... 实例化sink和logger后 // 获取内部缓冲队列 var queueField = typeof(PeriodicBatchingSink).GetField("_queue", BindingFlags.NonPublic | BindingFlags.Instance); var queue = queueField?.GetValue(kinesisSink) as ConcurrentQueue<LogEvent>; if (queue != null) { int pendingEvents = queue.Count; Console.WriteLine($"缓冲中剩余未处理日志事件数:{pendingEvents}"); }
3. 自定义可追踪Sink(最可靠,需额外开发)
若反射方式不够稳定,可基于AmazonKinesisSink封装自定义Sink,暴露缓冲状态属性:
public class TrackableKinesisSink : KinesisSink { private readonly ConcurrentQueue<LogEvent> _internalQueue; public TrackableKinesisSink(KinesisSinkOptions options, IAmazonKinesis kinesisClient) : base(options, kinesisClient) { // 通过反射获取父类的缓冲队列 var queueField = typeof(PeriodicBatchingSink).GetField("_queue", BindingFlags.NonPublic | BindingFlags.Instance); _internalQueue = queueField?.GetValue(this) as ConcurrentQueue<LogEvent>; } // 暴露缓冲事件数量属性 public int PendingEventCount => _internalQueue?.Count ?? 0; }
使用自定义Sink:
var trackableSink = new TrackableKinesisSink(options, kinesisClient); var logger = new LoggerConfiguration() .WriteTo.Sink(trackableSink) .CreateLogger(); // 随时检查缓冲状态 Console.WriteLine($"未处理日志数:{trackableSink.PendingEventCount}");
关键说明
- 默认情况下,
Logger.Dispose()会同步等待Kinesis Sink完成所有缓冲日志的发送,Dispose后一般不会有未处理事件残留。 - 优先使用手动
FlushAsync的方式确认状态,反射和自定义Sink作为特殊场景的补充方案。
内容的提问来源于stack exchange,提问作者praskulkarni88
相关产品推荐
相关产品推荐

