Entity Framework Core (EF Core) には、ログの生成、イベントへの応答、診断の取得のためのいくつかのメカニズムが含まれています。 これらはそれぞれ異なる状況に合わせて調整されており、複数のメカニズムが機能する場合でも、タスクに最適なメカニズムを選択することが重要です。 たとえば、データベース インターセプターを使用して SQL をログに記録することもできますが、これはログ記録に合わせたメカニズムの 1 つによってより適切に処理されます。 このページでは、これらの各メカニズムの概要と、それぞれの使用方法について説明します。
クイック リファレンス
次の表に、ここで説明するメカニズムの違いを簡単に説明します。
| メカニズム | 非同期 | Scope | 登録済み | 使用目的 |
|---|---|---|---|---|
| 単純なログ記録 | いいえ | 特定の状況に応じて | コンテキストの構成 | 開発時のログ記録 |
| Microsoft.Extensions.Logging | いいえ | コンテキストごと* | D.I. またはコンテキストの構成 | 運用環境のログ記録 |
| イベント | いいえ | コンテキストごとに応じて | いつでも | EF イベントへの対応 |
| Interceptors | はい | 各コンテキストごとに | コンテキストの構成 | EF 操作の管理 |
| 診断リスナー | いいえ | プロセス | 世界的に | アプリケーション診断 |
*通常、 Microsoft.Extensions.Logging は依存関係の挿入によってアプリケーションごとに構成されます。 ただし、EF レベルでは、必要に応じて、各コンテキストを異なるロガーで構成 できます 。
単純なログ記録
EF Core ログには、LogToするときにを使用して、任意の種類のアプリケーションからアクセスできます。 この構成は、通常、 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 イベント 」を参照してください。
傍受
EF Core インターセプターを使用すると、EF Core 操作のインターセプト、変更、抑制が可能になります。 これには、コマンドの実行などの低レベルのデータベース操作や、SaveChanges の呼び出しなどの上位レベルの操作が含まれます。
インターセプターは、インターセプトされる操作の変更または抑制を許可するという点で、ログ記録や診断とは異なります。 ログ記録には、単純なログ記録 または Microsoft.Extensions.Logging の方が適しています。
インターセプターは、コンテキストの構成時に DbContext インスタンスごとに登録されます。 診断リスナーを使用して、プロセス内のすべての DbContext インスタンスに対して同じ情報を取得します。
詳細については、 インターセプト を参照してください。
診断リスナー
診断リスナーを使用すると、現在の .NET プロセスで発生する EF Core イベントをリッスンできます。
診断リスナーは、単一の DbContext インスタンスからイベントを取得するのに適していません。 EF Core インターセプターは、コンテキストごとの登録を使用して同じイベントへのアクセスを提供します。
診断リスナーは、ログ記録用に設計されていません。 ログ記録には、単純なログ記録 または Microsoft.Extensions.Logging の方が適しています。
詳細については、「 EF Core での診断リスナーの使用 」を参照してください。
.NET