ログとインターセプトの概要

Entity Framework Core (EF Core) には、ログの生成、イベントへの応答、および診断の取得を行うためのメカニズムがいくつか含まれています。 これらはそれぞれ異なる状況に合わせて調整されており、複数のメカニズムが動作する可能性がある場合でも、タスクに最適なメカニズムを選択することが重要です。 たとえば、データベース インターセプターを使用して SQL をログに記録することもできますが、これはログに合わせて調整されたメカニズムの方がより適切に処理されます。 このページでは、これらの各メカニズムの概要を示し、それぞれを使用する状況について説明します。

クイック リファレンス

以下の表に、ここで説明するメカニズムの違いに関するクイック リファレンスを示します。

メカニズム 同期 Scope Registered 使用目的
シンプルなログ いいえ コンテキストごと コンテキスト構成 開発時のログ
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 での診断リスナーの使用」を参照してください。