You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何监控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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:39:40