.NET应用Azure Log Analytics中AppDependencies表数据量过大求助
解决.NET应用向Azure Log Analytics发送过量Service Bus依赖日志问题
问题根源
这类ServiceBusReceiver.Receive的依赖日志来自Azure Service Bus SDK的诊断追踪,不受ASP.NET Core全局日志级别直接控制。即使将全局日志级别设为Error,SDK默认仍会收集这类操作的依赖追踪数据,导致AppDependencies表数据量激增。
可行解决方案
1. 针对性限制Azure SDK日志级别
在appsettings.json中为Azure Service Bus及核心SDK命名空间单独设置日志级别:
{ "Logging": { "LogLevel": { "Default": "Error", "Microsoft": "Error", "Azure.Messaging.ServiceBus": "Error", "Azure.Core": "Error" } } }
2. 通过遥测处理器过滤特定依赖日志
如果不需要收集Service Bus接收操作的依赖数据,可添加自定义遥测处理器过滤这类条目:
using Microsoft.ApplicationInsights.Extensibility; using Microsoft.ApplicationInsights.DataContracts; var builder = WebApplication.CreateBuilder(args); builder.Services.AddApplicationInsightsTelemetry(); // 注册自定义遥测处理器 builder.Services.AddSingleton<ITelemetryProcessor>(sp => new FilterServiceBusReceiveTelemetry(sp.GetRequiredService<ITelemetryProcessor>())); var app = builder.Build(); // 处理器实现 public class FilterServiceBusReceiveTelemetry : ITelemetryProcessor { private readonly ITelemetryProcessor _nextProcessor; public FilterServiceBusReceiveTelemetry(ITelemetryProcessor nextProcessor) { _nextProcessor = nextProcessor; } public void Process(ITelemetry item) { if (item is DependencyTelemetry dep && dep.Type == "Azure Service Bus" && dep.Name == "ServiceBusReceiver.Receive") { return; // 跳过该日志,不发送到Log Analytics } _nextProcessor.Process(item); } }
3. 禁用Azure SDK的特定诊断活动
通过DiagnosticListener过滤非错误级别的Service Bus接收活动:
using System.Diagnostics; using Azure.Core; // 启用Azure SDK活动源(需Azure.Core 1.18+) AppContext.SetSwitch("Azure.Experimental.EnableActivitySource", true); var serviceBusListener = new DiagnosticListener("Azure.Messaging.ServiceBus"); serviceBusListener.Subscribe(new DiagnosticObserver()); public class DiagnosticObserver : IObserver<KeyValuePair<string, object>> { public void OnCompleted() { } public void OnError(Exception error) { } public void OnNext(KeyValuePair<string, object> value) { // 仅保留错误状态的接收活动 if (value.Key == "Azure.Messaging.ServiceBus.Receive" && value.Value is Activity activity && activity.Status != ActivityStatusCode.Error) { activity.SetTag("SuppressTelemetry", true); } } }
关键提示
Azure SDK的日志系统独立于ASP.NET Core全局配置,部分依赖追踪属于诊断活动范畴,常规日志级别设置无法控制这类数据。需针对Azure SDK命名空间单独配置,或通过遥测处理器/诊断观察者过滤不需要的条目。
内容的提问来源于stack exchange,提问作者cammart
相关产品推荐
相关产品推荐

