如何消除Application Insights默认记录的空SQL事件?
解决方案
方法1:通过Application Insights遥听器过滤特定EF Core事件
可以通过自定义遥听器处理器,精准过滤掉EF Core生成的空连接事件。修改你的Application Insights配置代码,并添加处理器类:
services.AddApplicationInsightsTelemetry(opt => { opt.EnableAdaptiveSampling = false; // 注册自定义遥听器处理器 opt.TelemetryProcessors.Add<FilterEmptyEfConnectionEventsProcessor>(); }); // 自定义遥听器处理器,用于过滤空EF连接事件 public class FilterEmptyEfConnectionEventsProcessor : ITelemetryProcessor { private readonly ITelemetryProcessor _nextProcessor; public FilterEmptyEfConnectionEventsProcessor(ITelemetryProcessor next) { _nextProcessor = next; } public void Process(ITelemetry telemetryItem) { if (telemetryItem is EventTelemetry eventTelemetry) { // 匹配EF Core的数据库连接事件,且仅包含数据库名、主机名两个属性的空事件 if (eventTelemetry.Name == "Microsoft.EntityFrameworkCore.Database.Connection" && eventTelemetry.Properties.Count == 2 && string.IsNullOrEmpty(eventTelemetry.Summary)) { // 跳过该事件,不发送至Application Insights return; } } // 处理其他正常遥测事件 _nextProcessor.Process(telemetryItem); } }
方法2:禁用EF Core的特定日志类别(谨慎使用)
如果不需要EF Core的数据库连接相关日志,可以直接在EF Core配置中禁用对应日志类别,从源头阻止事件生成:
services.AddDbContext<MyDbContext>((serviceProvider, options) => { options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); options.UseSqlServer(connectionString); // 禁用数据库连接类别的日志输出 options.LogTo(_ => {}, LogLevel.None, new[] { DbLoggerCategory.Database.Connection.Name }); });
注意:此方法会完全关闭EF Core的数据库连接日志,若需要保留部分有用的连接日志,优先选择方法1进行精准过滤。
内容的提问来源于stack exchange,提问作者bpiec
相关产品推荐
相关产品推荐

