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

C#控制台应用如何将Kafka SSL相关报错捕获到Serilog的sink中

未被采集的FAIL日志是Confluent.Kafka底层依赖的C库librdkafka默认输出到标准错误流的内容,没有接入.NET的日志抽象层,因此Serilog默认无法捕获这类日志。要实现采集,只需要将librdkafka的日志输出转发到Serilog管道即可。

具体实现步骤

通过ProducerBuilder提供的SetLogHandler配置项注册日志处理委托,直接将底层日志转发到Serilog即可:

var config = new ProducerConfig
{
    BootstrapServers = Server,
    SslCaLocation = "data.cer",
    SecurityProtocol = SecurityProtocol.Ssl,
    // 可选:按需配置librdkafka要输出的日志模块,默认已包含ERROR/FAIL级日志,不需要全量日志可以不配置
    // Debug = "broker,security,topic"
};

using var producer = new ProducerBuilder<Null, string>(config)
    // 注册librdkafka日志处理委托
    .SetLogHandler((_, logMessage) =>
    {
        // 映射librdkafka日志级别到Serilog日志级别
        var logLevel = logMessage.Level switch
        {
            // librdkafka日志级别说明:0=紧急 1=警报 2=严重 3=错误 4=警告 5=通知 6=信息 7=调试
            <= 3 => Serilog.Events.LogEventLevel.Error,
            4 => Serilog.Events.LogEventLevel.Warning,
            5 or 6 => Serilog.Events.LogEventLevel.Information,
            >= 7 => Serilog.Events.LogEventLevel.Debug
        };
        // 写入Serilog,自动同步到所有已配置的Sink(文件、控制台、Debug等)
        Log.Write(logLevel, "Librdkafka [{Facility}] {Name}: {Message}", 
            logMessage.Facility, logMessage.Name, logMessage.Message);
    })
    .Build();

补充说明

  • 如果你使用的是Kafka消费者,操作逻辑完全一致,替换为ConsumerBuilder.SetLogHandler即可
  • 如不想直接使用Serilog静态类,也可以将日志写入你从DI容器中获取的ILogger<Program>实例,日志级别映射逻辑不变
  • 配置中的Debug项不要随意设置为all,会产生大量冗余日志,仅在排查特定问题时按需开启指定模块即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 18:54:03