日志记录和侦听的概述

Entity Framework Core (EF Core) 包含一些用于生成日志、响应事件和获取诊断结果的机制。 其中每种机制都针对不同情况进行了定制,务必针对手头上的任务选择最佳机制,即使是多个机制都适用也是如此。 例如,数据库侦听器可用于记录 SQL,但使用针对日志记录定制的机制之一来处理,效果会更好。 本页面概要介绍了上述每种机制,描述了每种机制的使用场景。

快速参考

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

机制 Async 范围 已注册 预期用途
简单的日志记录 按上下文 上下文配置 开发时日志记录
Microsoft.Extensions.Logging 按上下文* D.I. 或上下文配置 生产日志记录
事件 按上下文 任何时间 对 EF 事件做出反应
拦截器 按上下文 上下文配置 进行 EF 操作
诊断侦听器 进程 全局 应用程序诊断

*Microsoft.Extensions.Logging 通常通过依赖项注入在每个应用程序中进行配置。 但在 EF 级别,可使用不同的记录器配置每个上下文。

简单的日志记录

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

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

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

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

Microsoft.Extensions.Logging

Microsoft.Extensions.Logging 是一种可扩展的日志记录机制,适用于很多常见日志记录系统的插件提供程序。 EF Core 与 Microsoft.Extensions.Logging 完全集成,并且 ASP.NET Core 应用程序默认使用这种形式的日志记录。

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

事件

当 EF Core 代码中发生某些事情时,EF Core 公开 .NET 事件以用作回调。 事件比侦听器简单,并且允许更灵活的注册。 但是,它们只是同步,因此不能执行非阻塞异步 I/O。

每个 DbContext 实例都会注册事件,并且可以随时进行此注册。 使用诊断侦听器获取相同的信息,但要获取进程中所有 DbContext 实例的信息。

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

Interception

EF Core 侦听器支持 EF Core 操作的侦听、修改和/或抑制。 这包括低级数据库操作(例如执行命令)以及高级别操作(例如对 SaveChanges 的调用)。

侦听器与日志记录和诊断的不同之处在于,它们允许修改或抑制所侦听的操作。 简单日志记录Microsoft.Extensions.Logging 是日志记录的更好选择。

配置上下文时,将按 DbContext 实例注册侦听器。 使用诊断侦听器获取相同的信息,但要获取进程中所有 DbContext 实例的信息。

有关详细信息,请参阅侦听

诊断侦听器

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

诊断侦听器不适合从单个 DbContext 实例获取事件。 EF Core 侦听器使用按个上下文注册提供对相同事件的访问。

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

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