我正在使用 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 会以某种方式记录它......
如何摆脱这个事件?我猜它是由 EF Core 默认以某种方式记录的
是的,默认情况下,Application Insights 由 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());
});
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);
}
}