Поделиться через


Общие сведения о ведении журналов и перехвате

Entity Framework Core (EF Core) содержит несколько механизмов создания журналов, реагирования на события и получения диагностики. Каждый из них предназначен для различных ситуаций, и важно выбрать оптимальный механизм для конкретной задачи, даже если для ее решения подходят несколько механизмов. Например, для ведения журнала SQL можно использовать перехватчик базы данных, однако лучше для этой цели подойдет один из механизмов, адаптированный для ведения журнала. На этой странице представлен обзор каждого из этих механизмов и описано, когда они должны использоваться.

Краткий справочник

В указанной ниже таблице приведены краткие сведения о различиях между описанными здесь механизмами.

Механизм Асинхронная Область действия Зарегистрировано предполагаемое использование;
Простое ведение журнала No Для каждого контекста Конфигурация контекста Ведение журнала во время разработки
Microsoft.Extensions.Logging No Для каждого контекста* Конфигурация внедрения зависимостей или контекста Ведение журнала в рабочей среде
События No Для каждого контекста в любое время Реагирование на события EF
Перехватчики Да Для каждого контекста Конфигурация контекста Обработка операций EF
Прослушиватели данных диагностики No Обработать Глобально Диагностика приложения

* Как правило, Microsoft.Extensions.Logging настраивается для каждого приложения с помощью внедрения зависимостей. Однако на уровне Entity Framework возможна настройка разных средств ведения журнала для каждого контекста, если это необходимо.

Простое ведение журнала

Доступ к журналам EF Core можно получить из любого типа приложений с помощью метода LogTo при настройке экземпляра DbContext. Такая конфигурация обычно выполняется при переопределении 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.

Дополнительные сведения см. в статье об использовании Microsoft.Extensions.Logging в EF Core.

События

EF Core предоставляет события .NET в качестве обратных вызовов, когда в коде EF Core происходят определенные действия. Использовать события проще по сравнению с перехватчиками. Они также обеспечивают более гибкую регистрацию. Однако они только синхронизируются и поэтому не могут выполнять неблокирующие асинхронные операции ввода-вывода.

События регистрируются для каждого экземпляра DbContext. Эту регистрацию можно выполнить в любое время. С помощью прослушивателя диагностики можно получить ту же информацию, но для всех экземпляров DbContext в процессе.

Дополнительные сведения см. в статье о событиях .NET в EF Core.

Interception

Перехватчики EF Core позволяют выполнять перехват, изменение и подавление операций EF Core. Сюда входят низкоуровневые операции с базами данных, такие как выполнение команды, а также операции более высокого уровня, такие как вызовы SaveChanges.

Перехватчики отличаются от ведения журнала и диагностики, так как они позволяют изменять или подавлять перехватываемую операцию. Для ведения журнала лучше всего использовать средство простого ведения журнала или Microsoft.Extensions.Logging.

Перехватчики регистрируются для каждого экземпляра DbContext во время настройки контекста. С помощью прослушивателя диагностики можно получить ту же информацию, но для всех экземпляров DbContext в процессе.

Подробные сведения см. в статье Перехватчики.

Прослушиватели диагностики

Прослушиватели диагностики позволяют прослушивать любое событие EF Core, возникающее в текущем процессе .NET.

Прослушиватели диагностики не подходят для получения событий из одного экземпляра DbContext. Перехватчики EF Core предоставляют доступ к одним и тем же событиям с регистрацией для каждого контекста.

Прослушиватели диагностики не предназначены для ведения журнала. Для ведения журнала лучше всего использовать средство простого ведения журнала или Microsoft.Extensions.Logging.

Дополнительные сведения см. в статье об использовании прослушивателей диагностики в EF Core.