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

如何实现带健康监控的Serilog Async Sink?

Serilog异步接收器健康监控(IAsyncLogEventSinkMonitor)实现指南

核心逻辑说明

IAsyncLogEventSinkMonitor是Serilog异步接收器的健康监控接口,主要用于捕获缓冲区过载和日志事件丢失两种异常场景,只需实现接口的两个核心方法即可完成监控逻辑。


1. 实现监控类

创建自定义监控类,实现IAsyncLogEventSinkMonitor接口,在对应方法中编写告警、统计或通知逻辑:

using Serilog.Sinks.Async;
using Serilog.Events;

public class SinkHealthMonitor : IAsyncLogEventSinkMonitor
{
    // 缓冲区过载时触发(队列满导致事件丢弃)
    public void OnBufferOverloaded(int queueSize, int droppedEventsCount)
    {
        // 示例:输出告警日志,可替换为推送监控指标、发送即时消息等
        Console.WriteLine($"[Sink告警] 缓冲区过载!当前队列大小: {queueSize}, 累计丢弃事件数: {droppedEventsCount}");
        // 扩展:写入专门的监控日志文件
        // File.AppendAllText("sink-alerts.log", $"[{DateTime.Now}] 缓冲区过载: {queueSize}/{droppedEventsCount}\n");
    }

    // 日志事件丢失时触发(含多种丢失原因)
    public void OnLogEventLost(LogEvent logEvent, LostLogEventReason reason)
    {
        // 示例:记录丢失事件的详情和原因
        Console.WriteLine($"[Sink告警] 日志事件丢失!原因: {reason}, 事件级别: {logEvent.Level}, 消息: {logEvent.MessageTemplate}");
        // 扩展:按原因统计丢失次数(如对接Prometheus指标)
        // Metric.LogEventLostCount.WithLabels(reason.ToString()).Inc();
    }
}

2. 关联到异步接收器

在Serilog配置中,将自定义监控类实例传入异步接收器的monitor参数:

var logger = new LoggerConfiguration()
    .WriteTo.Async(
        sink => sink.Console(), // 替换为你的实际业务接收器(如File、Elasticsearch等)
        bufferSize: 1000, // 根据日志量调整缓冲区大小,过小易触发过载
        monitor: new SinkHealthMonitor() // 绑定健康监控类
    )
    .CreateLogger();

3. 进阶扩展建议

  • 轻量优先:监控逻辑必须简洁,避免执行耗时操作(如远程调用),防止阻塞日志处理流程
  • 差异化处理:LostLogEventReason包含BufferOverflow(缓冲区满)、SinkFailure(接收器写入失败)、ShutdownTimeout(关闭超时)三种原因,可针对不同场景做专属告警
  • 指标集成:将过载、丢失事件转化为监控指标(如OpenTelemetry、Prometheus),便于在APM平台可视化分析

内容的提问来源于stack exchange,提问作者lonix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:02:10