通过


日志记录和拦截概述

Entity Framework Core (EF Core) 包含多种机制,用于生成日志、响应事件和获取诊断。 其中每一种都针对不同的情况定制,即使多个机制可以正常工作,也请务必为手头任务选择最佳机制。 例如,数据库拦截器可用于记录 SQL,但最好由为日志记录量身定做的机制之一进行处理。 本页概述了每种机制,并描述了何时应使用每个机制。

快速参考

下表提供了此处所述的机制之间的差异的快速参考。

机制 异步 Scope 注册 预期用途
简单日志记录 按上下文 上下文配置 开发阶段日志记录
Microsoft.Extensions.Logging 根据上下文 D.I. 或上下文配置 生产日志记录
事件 按上下文 随时 响应 EF 事件
Interceptors 是的 根据上下文 上下文配置 操控EF操作
诊断监听器 过程 全球 应用程序诊断

通常通过依赖项注入为每个应用单独配置Microsoft.Extensions.Logging。 但是,在 EF 级别,可以根据需要使用不同的记录器配置每个上下文。

简单日志记录

在配置 DbContext 实例时,可以通过使用LogTo来访问任何类型应用程序中的 EF Core 日志。 此配置通常在重写 DbContext.OnConfiguring中完成。 例如:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.LogTo(Console.WriteLine);

此概念类似于 Database.Log 中的 EF6。

有关详细信息,请参阅 简单日志记录

Microsoft.Extensions.Logging

Microsoft.Extensions.Logging 是一种可扩展的日志记录机制,其中包含许多常见日志记录系统的插件提供程序。 EF Core 完全集成 Microsoft.Extensions.Logging ,默认情况下,此形式的日志记录用于 ASP.NET Core 应用程序。

有关详细信息,请参阅 EF Core 中使用 Microsoft.Extensions.Logging

事件

EF Core 公开 .NET 事件,用于在 EF Core 代码中发生某些情况时进行回调。 事件比拦截器更简单,并且允许更灵活地进行注册。 但是,它们仅支持同步,因此无法执行非阻塞异步 I/O。

每个 DbContext 实例注册事件,可以随时完成此注册。 使用 诊断侦听器 获取相同的信息,但对于进程中的所有 DbContext 实例。

有关详细信息 ,请参阅 EF Core 中的 .NET 事件

拦截

EF Core 拦截器允许截获、修改和/或抑制 EF Core 操作。 这包括执行命令等低级别数据库作,以及更高级别的作,例如对 SaveChanges 的调用。

拦截器与日志记录和诊断不同,因为拦截器允许修改或抑制正在拦截的操作。 简单的日志记录Microsoft.Extensions.Logging 是日志记录的更好选择。

配置上下文时,会为每个 DbContext 实例注册侦听器。 使用 诊断侦听器 获取相同的信息,但对于进程中的所有 DbContext 实例。

有关详细信息,请参阅 拦截

诊断侦听器

诊断侦听器允许侦听当前 .NET 进程中发生的任何 EF Core 事件。

诊断侦听器不适合从单个 DbContext 实例获取事件。 EF Core 拦截器通过对每个上下文进行注册提供对相同事件的访问权限。

诊断侦听器不用于日志记录。 简单的日志记录Microsoft.Extensions.Logging 是日志记录的更好选择。

有关详细信息,请参阅 EF Core 中的“使用诊断侦听器 ”。