配置Rebus记录收发消息遇阻:Serilog无Debug日志问题
核心问题分析
问题根源在于Serilog默认未开启DEBUG级别日志过滤,加上错误的Logger上下文配置,再配合Worker Service默认的日志规则,导致Rebus的消息追踪日志被完全拦截。
具体修复步骤
1. 正确配置Serilog最小日志级别
Serilog默认最小日志级别为Information,会直接丢弃DEBUG级日志。需显式开启全局DEBUG级别,同时可针对Rebus命名空间单独配置,避免其他库的DEBUG日志泛滥:
Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() // 全局开启DEBUG级别 .MinimumLevel.Override("Rebus", LogEventLevel.Debug) // 确保Rebus的日志级别为DEBUG .MinimumLevel.Override("Microsoft", LogEventLevel.Information) // 抑制Microsoft库的DEBUG日志,减少冗余输出 .WriteTo.ApplicationInsights(telConfig, TelemetryConverter.Traces, LogEventLevel.Debug) .Enrich.WithRebusCorrelationId("CorrelationId") .Enrich.WithProperty("Service", typeof(Program).Assembly.FullName) // 替换原错误的ForContext用法 .CreateLogger();
2. 修正无效的ForContext用法
你原代码中Log.Logger.ForContext(...)不生效,因为该方法返回新的Logger实例,但未重新赋值给全局Log.Logger。改用Enrich.WithProperty添加服务名称属性才是正确方式。
3. 调整Worker Service日志过滤配置
在appsettings.json中,确保Logging节点未过滤DEBUG级日志:
{ "Logging": { "LogLevel": { "Default": "Debug", "Rebus": "Debug", "Microsoft": "Information" } } }
4. 完善Rebus配置
确保Rebus启用消息追踪,并修正可能的笔误(你的Transport配置中写了wc.RabbitMq,但用的是Azure Service Bus,需替换为正确的连接字符串变量):
services.AddRebus((configure, provider) => { return configure .Logging(l => l.Serilog()) .Transport(t => t.UseAzureServiceBus(wc.AzureServiceBusConnStr, wc.InputQueueName)) // 修正连接字符串变量名 .Options(o => { o.SetNumberOfWorkers(5); o.EnableMessageTracing(); // 显式启用消息追踪,确保生成出入日志 }) .Routing(r => r.TypeBased().MapAssemblyOf<CreateNewCustomerCommand>(wc.InputQueueName)); });
5. 测试ColouredConsole输出
如果切换到ColouredConsole,需确保输出级别设置为Debug:
.WriteTo.ColoredConsole(LogEventLevel.Debug)
验证方法
重启服务后发送/接收消息,查看Application Insights的Traces或ColouredConsole输出,应能看到Rebus生成的类似Received message {MessageId} with correlation id {CorrelationId}、Sent message {MessageId} to {QueueName}的DEBUG级日志。
内容的提问来源于stack exchange,提问作者Kenneth Jakobsen

