Azure Function使用Serilog如何配置仅保留应用相关业务日志
问题原因
你漏了Service Bus相关日志源的级别覆盖配置。你看到的ReceiveBatchAsync、消息处理器启动这类INFO级日志,来自Azure Service Bus SDK、Functions Service Bus绑定扩展两个组件,你现有配置的覆盖规则没有包含这两个命名空间,所以这部分日志没有被过滤。
调整方案
1. 补充缺失的命名空间过滤规则
在现有LoggerConfiguration的Override配置块中,追加Service Bus相关组件的级别配置,将这部分日志的最低输出级别设为Warning,即可过滤掉你贴出来的所有队列操作冗余INFO日志:
// 追加以下三行配置 .MinimumLevel.Override("Azure.Messaging.ServiceBus", LogEventLevel.Warning) // Service Bus SDK本身的日志 .MinimumLevel.Override("Microsoft.Azure.WebJobs.ServiceBus", LogEventLevel.Warning) // In-process模型下Functions Service Bus绑定日志 .MinimumLevel.Override("Microsoft.Azure.Functions.Worker.ServiceBus", LogEventLevel.Warning) // Isolated Worker模型下Functions Service Bus绑定日志
2. (推荐)采用默认高等级+业务命名空间白名单的配置模式
如果要彻底避免后续新增组件带来的冗余日志,不要只靠黑名单逐个屏蔽框架日志,反过来配置全局默认最低输出级别为Warning,仅把你自己业务代码所在的命名空间放开到Information级别,从根源上只输出业务日志。完整配置示例如下:
var logger = new LoggerConfiguration() // 全局默认仅输出Warning及以上级别日志 .MinimumLevel.Warning() // 替换成你自己业务代码的实际根命名空间,仅放开这部分的INFO级别日志 .MinimumLevel.Override("YourBusinessNamespace", LogEventLevel.Information) // 原有框架日志兜底过滤配置 .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) .MinimumLevel.Override("Worker", LogEventLevel.Warning) .MinimumLevel.Override("Host", LogEventLevel.Warning) .MinimumLevel.Override("Host.Aggregator", LogEventLevel.Warning) .MinimumLevel.Override("Host.Results", LogEventLevel.Warning) .MinimumLevel.Override("System", LogEventLevel.Error) .MinimumLevel.Override("Function", LogEventLevel.Error) .MinimumLevel.Override("Azure.Storage.Blobs", LogEventLevel.Error) .MinimumLevel.Override("Azure.Core", LogEventLevel.Error) // 新增的Service Bus过滤配置 .MinimumLevel.Override("Azure.Messaging.ServiceBus", LogEventLevel.Warning) .MinimumLevel.Override("Microsoft.Azure.WebJobs.ServiceBus", LogEventLevel.Warning) .MinimumLevel.Override("Microsoft.Azure.Functions.Worker.ServiceBus", LogEventLevel.Warning) // 后续接你的WriteTo等其他配置 .CreateLogger();
3. 未知冗余日志排查方法
如果后续还有未识别的冗余INFO日志输出,可以临时修改Serilog的输出模板,加入{SourceContext}字段,直接打印每条日志所属的源命名空间,针对对应命名空间追加过滤规则即可,无需猜解日志来源。示例输出模板配置:
var logger = new LoggerConfiguration() // 其他配置省略 .WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}") .CreateLogger();
调整后每条日志都会携带类似Azure.Messaging.ServiceBus.Receiver这样的源标识,直接对根命名空间加Override规则即可。
内容的提问来源于stack exchange,提问作者user584018
相关产品推荐
相关产品推荐

