日志记录和拦截概述

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 中的“使用诊断侦听器 ”。