ログとインターセプトの概要Overview of Logging and Interception

Entity Framework Core (EF Core) には、ログの生成、イベントへの応答、および診断の取得を行うためのメカニズムがいくつか含まれています。Entity Framework Core (EF Core) contains several mechanisms for generating logs, responding to events, and obtaining diagnostics. これらはそれぞれ異なる状況に合わせて調整されており、複数のメカニズムが動作する可能性がある場合でも、タスクに最適なメカニズムを選択することが重要です。Each of these is tailored to different situations, and it is important to select the best mechanism for the task in hand, even when multiple mechanisms could work. たとえば、データベース インターセプターを使用して SQL をログに記録することもできますが、これはログに合わせて調整されたメカニズムの方がより適切に処理されます。For example, a database interceptor could be used to log SQL, but this is better handled by one of the mechanisms tailored to logging. このページでは、これらの各メカニズムの概要を示し、それぞれを使用する状況について説明します。This page presents an overview of each of these mechanisms and describes when each should be used.

クイック リファレンスQuick reference

以下の表に、ここで説明するメカニズムの違いに関するクイック リファレンスを示します。The table below provides a quick reference for the differences between the mechanisms described here.

メカニズムMechanism AsyncAsync ScopeScope 登録済みRegistered 使用目的Intended use
シンプルなログSimple Logging いいえNo コンテキストごとPer context コンテキスト構成Context configuration 開発時のログDevelopment-time logging
Microsoft.Extensions.LoggingMicrosoft.Extensions.Logging いいえNo コンテキストごと*Per context* D.I.D.I. またはコンテキスト構成or context configuration 本番環境のログProduction logging
イベントEvents いいえNo コンテキストごとPer context 時間指定なしAny time EF イベントへの応答Reacting to EF events
インターセプターInterceptors YesYes コンテキストごとPer context コンテキスト構成Context configuration EF 操作の取り扱いManipulating EF operations
診断リスナーDiagnostics listeners いいえNo プロセスProcess グローバルGlobally アプリケーション診断Application diagnostics

*通常、Microsoft.Extensions.Logging は依存関係の挿入を使用してアプリケーションごとに構成されますが、EF レベルでは、必要に応じて異なるロガーを使用して各コンテキストを構成 できます*Typically Microsoft.Extensions.Logging is configured per-application via dependency injection However, at the EF level, each context can be configured with a different logger if needed.

シンプルなログSimple logging

注意

この機能は EF Core 5.0 で導入されました。This feature was introduced in EF Core 5.0.

DbContext インスタンスの構成時に LogTo を使用すると、任意の種類のアプリケーションから EF Core ログにアクセスできます。EF Core logs can be accessed from any type of application through the use of LogTo when configuring a DbContext instance. この構成は、通常、DbContext.OnConfiguring のオーバーライドで行われます。This configuration is commonly done in an override of DbContext.OnConfiguring. 次に例を示します。For example:

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

この概念は、EF6 の Database.Log に似ています。This concept is similar to Database.Log in EF6.

詳細については、「シンプルなログ」を参照してください。See Simple Logging for more information.

Microsoft.Extensions.LoggingMicrosoft.Extensions.Logging

Microsoft.Extensions.Logging は、多くの一般的なログ システム用のプラグイン プロバイダーを備えた拡張可能なログ メカニズムです。Microsoft.Extensions.Logging is an extensible logging mechanism with plug-in providers for many common logging systems. EF Core は Microsoft.Extensions.Logging と完全に統合されており、ASP.NET Core アプリケーションでは既定でこの形式のログが使用されます。EF Core fully integrates with Microsoft.Extensions.Logging and this form of logging is used by default for ASP.NET Core applications.

詳細については、EF Core での Microsoft.Extensions.Logging の使用に関する記事をご覧ください。See Using Microsoft.Extensions.Logging in EF Core for more information.

イベントEvents

注意

EF Core 5.0 では、追加のイベントが導入されました。Additional events were introduced in EF Core 5.0.

EF Core では、EF Core コードで特定の処理が発生したときにコールバックとして機能する .NET イベントが公開されます。EF Core exposes .NET events to act as callbacks when certain things happen in the EF Core code. イベントはインターセプターよりシンプルであり、より柔軟な登録が可能です。Events are simpler than interceptors and allow more flexible registration. ただし、これらは同期のみであるため、非ブロッキングの非同期 I/O を実行することはできません。However, they are sync only and so cannot perform non-blocking async I/O.

イベントは DbContext インスタンスごとに登録され、この登録はいつでも行うことができます。Events are registered per DbContext instance and this registration can be done at any time. プロセス内のすべての DbContext インスタンスで同じ情報を取得するには、診断リスナーを使用します。Use a diagnostic listener to get the same information but for all DbContext instances in the process.

詳細については、「EF Core での .NET イベント」を参照してください。See .NET Events in EF Core for more information.

interceptionInterception

注意

この機能は EF Core 3.0 で導入されました。This feature was introduced in EF Core 3.0. EF Core 5.0 では、追加のインターセプターが導入されました。Additional interceptors were introduced in EF Core 5.0.

EF Core インターセプターを使用すると、EF Core 操作をインターセプト、変更、抑制できます。EF Core interceptors enable interception, modification, and/or suppression of EF Core operations. これには、コマンド実行などの低レベルのデータベース操作と SaveChanges の呼び出しなどの上位レベルの操作が含まれます。This includes low-level database operations such as executing a command, as well as higher-level operations, such as calls to SaveChanges.

インターセプターは、インターセプトしている操作を変更または抑制できる点がログや診断と異なります。Interceptors are different from logging and diagnostics in that they allow modification or suppression of the operation being intercepted. ログ記録には、シンプルなログまたは Microsoft.Extensions.Logging の使用をお勧めします。Simple logging or Microsoft.Extensions.Logging are better choices for logging.

インターセプターは DbContext インスタンスごとに登録され、この登録はいつでも行うことができます。Interceptors are registered per DbContext instance when the context is configured. プロセス内のすべての DbContext インスタンスで同じ情報を取得するには、診断リスナーを使用します。Use a diagnostic listener to get the same information but for all DbContext instances in the process.

詳細については、インターセプトに関する記事をご覧ください。See Interception for more information.

診断リスナーDiagnostic listeners

診断リスナーを使用すると、現在の .NET プロセスで発生する任意の EF Core イベントをリッスンできます。Diagnostic listeners allow listening for any EF Core event that occurs in the current .NET process.

診断リスナーは、単一の DbContext インスタンスからイベントを取得するのには適していません。Diagnostic listeners are not suitable for getting events from a single DbContext instance. EF Core インターセプターは、コンテキストごとの登録によって同じイベントへのアクセスを可能にします。EF Core interceptors provide access to the same events with per-context registration.

診断リスナーは、ログ記録向けに設計されていません。Diagnostic listeners are not designed for logging. ログ記録には、シンプルなログまたは Microsoft.Extensions.Logging の使用をお勧めします。Simple logging or Microsoft.Extensions.Logging are better choices for logging.

詳細については、「EF Core での診断リスナーの使用」を参照してください。See Using diagnostic listeners in EF Core for more information.