Application Insights – 默认情况下记录空 SQL 事件

问题描述 投票:0回答:1

我正在使用 Azure Application Insights,配置如下:

services.AddApplicationInsightsTelemetry(opt =>
{
    opt.EnableAdaptiveSampling = false;
});

然后我添加 EF Core:

services.AddDbContext<MyDbContext>((serviceProvider, options) =>
{
    options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
    options.UseSqlServer(connectionString);
});

在 Application Insights 中查看日志时,我看到以下事件:

几乎是空的,只包含数据库名称和主机名。

如何摆脱这个事件?我猜想默认情况下 EF Core 会以某种方式记录它......

azure-application-insights
1个回答
0
投票

如何摆脱这个事件?我猜它是由 EF Core 默认以某种方式记录的

是的,默认情况下,Application Insights 由 EF Core 的日志记录生成,但可能并非所有应用程序都需要,特别是在可能会产生大量噪音的生产环境中。

  • 要从 Application Insights 中删除这些 EF Core 日志记录事件,您可以调整 EF Core 的日志记录配置。

EF Core 使用 .NET 的内置日志记录框架,这意味着您可以使用标准日志记录配置选项来控制其日志记录行为。

services.AddDbContext<MyDbContext>((serviceProvider, options) =>
{
    options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
    options.UseSqlServer(connectionString);
    options
        .UseLoggerFactory(LoggerFactory.Create(builder => {
            builder.AddFilter((category, level) =>
                category == DbLoggerCategory.Database.Command.Name && level == LogLevel.Information);
        }))
        .EnableSensitiveDataLogging(); // If needed, enables logging of parameter values
});
  • AddFilter
    用于指定应接受哪些日志消息。在这种情况下,我们仅接受来自
    DbLoggerCategory.Database.Command
    级别的
    Information
    类别的日志消息。这是对应 EF Core 中数据库命令日志记录的类别。

  • EnableSensitiveDataLogging
    是一种可选方法,除了 SQL 命令之外还可以记录参数值。 注意: 请谨慎使用此选项,因为它可能会记录敏感数据。

请遵循以下方法,它将防止在 Application Insights 中创建依赖项。

services.AddDbContext<MyDbContext>((serviceProvider, options) =>
{
    options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
    options.UseSqlServer(connectionString);
    options
        .AddInterceptors(new MyEmptyDependencyInterceptor());
});
  • 在此方法中,MyEmptyDependencyInterceptor 是一个自定义拦截器,您可以创建它来拦截 EF Core 的命令并阻止它们在 Application Insights 中创建依赖项
public class MyEmptyDependencyInterceptor : DbCommandInterceptor
{
    public override InterceptionResult<DbDataReader> ReaderExecuting(
        DbCommand command,
        CommandEventData eventData,
        InterceptionResult<DbDataReader> result)
    {
        // Prevent the command from being executed
        return InterceptionResult<DbDataReader>.SuppressWithResult(default);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.