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
相关产品推荐
相关产品推荐

