Übersicht über Protokollierung und Abfangfunktionen
Entity Framework Core (EF Core) enthält mehrere Mechanismen für das Erstellen von Protokollen, Reagieren auf Ereignisse und Erstellen von Diagnosen. Diese Mechanismen sind jeweils auf verschiedene Situationen zugeschnitten, und es ist wichtig, den besten Mechanismus für die betreffende Aufgabe auszuwählen, auch wenn mehrere Mechanismen möglich wären. Ein Datenbankinterceptor könnte beispielsweise für eine SQL-Protokollierung verwendet werden. Besser hierfür eignen sich jedoch protokollierungsspezifische Mechanismen. Auf dieser Seite finden Sie eine Übersicht der verschiedenen Mechanismen sowie Erläuterungen, wann die einzelnen verwendet werden sollten.
Kurzreferenz
In der folgenden Tabelle finden Sie eine kurze Übersicht über die Unterschiede zwischen den hier beschriebenen Mechanismen.
Mechanismus | Async | `Scope` | Registriert | Verwendungszweck |
---|---|---|---|---|
Einfache Protokollierung | Nein | Pro Kontext | Kontextbezogene Konfiguration | Protokollierung zur Entwicklungszeit |
Microsoft.Extensions.Logging | Nein | Pro Kontext* | Abhängigkeitsinjektion oder kontextbezogene Konfiguration | Produktionsprotokollierung |
Ereignisse | Nein | Pro Kontext | Jederzeit | Reagieren auf EF-Ereignisse |
Interceptors | Ja | Pro Kontext | Kontextbezogene Konfiguration | Manipulieren von EF-Vorgängen |
Diagnoselistener | Nein | Verarbeiten | Global | Anwendungsdiagnose |
* In der Regel wird Microsoft.Extensions.Logging
per Dependency Injection pro Anwendung konfiguriert. Auf EF-Ebene kann jedoch jeder Kontext bei Bedarf mit einer anderen Protokollierung konfiguriert werden.
Einfache Protokollierung
Beim Konfigurieren einer DbContext-Instanz kann von jedem Anwendungstyp aus mithilfe von LogTo auf EF Core-Protokolle zugegriffen werden. Diese Konfiguration erfolgt in der Regel durch ein Überschreiben von DbContext.OnConfiguring. Beispiel:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.LogTo(Console.WriteLine);
Dieses Konzept ähnelt Database.Log in EF6.
Weitere Informationen finden Sie unter Einfache Protokollierung.
Microsoft.Extensions.Logging
Microsoft.Extensions.Logging ist ein erweiterbarer Protokollierungsmechanismus mit Plug-In-Anbietern für viele gängige Protokollierungssysteme. EF Core ist vollständig in Microsoft.Extensions.Logging
integriert, und diese Art von Protokollierung wird standardmäßig für ASP.NET Core-Anwendungen verwendet.
Weitere Informationen finden Sie unter Verwenden von Microsoft.Extensions.Logging in EF Core.
Ereignisse
EF Core stellt .NET-Ereignisse bereit, die als Rückrufe fungieren, wenn bestimmte Dinge im EF Core-Code auftreten. Ereignisse sind einfacher als Abfangfunktionen und ermöglichen eine flexiblere Registrierung. Sie sind jedoch nur synchron und können daher keine nicht blockierenden asynchronen E/A-Vorgänge durchführen.
Ereignisse werden pro DbContext-Instanz registriert, und diese Registrierung kann zu einem beliebigen Zeitpunkt durchgeführt werden. Verwenden Sie einen Diagnoselistener, um dieselben Informationen abzurufen, jedoch für alle DbContext-Instanzen im Prozess.
Weitere Informationen finden Sie unter .NET-Ereignisse in EF Core.
Interception
EF Core-Abfangfunktionen ermöglichen das Abfangen, Ändern und/oder Unterdrücken von EF Core-Vorgängen. Dies umfasst Datenbankvorgänge auf niedriger Ebene, z. B. das Ausführen eines Befehls, sowie Vorgänge höherer Ebene, z. B. Aufrufe von SaveChanges.
Abfangfunktionen unterscheiden sich von Protokollierung und Diagnose insofern, als sie eine Änderung oder Unterdrückung des abzufangenden Vorgangs ermöglichen. Einfache Protokollierung oder Microsoft.Extensions.Logging sind bessere Optionen für Protokollierung.
Abfangfunktionen werden pro DbContext-Instanz registriert, wenn der Kontext konfiguriert wird. Verwenden Sie einen Diagnoselistener, um dieselben Informationen abzurufen, jedoch für alle DbContext-Instanzen im Prozess.
Weitere Informationen finden Sie unter Abfangfunktionen.
Diagnoselistener
Diagnoselistener ermöglichen das Lauschen auf EF Core-Ereignisse, die im aktuellen .NET-Prozess auftreten.
Diagnoselistener sind nicht geeignet, um Ereignisse aus einer einzelnen DbContext-Instanz abzurufen. EF Core-Abfangfunktionen ermöglichen Zugriff auf dieselben Ereignisse mit Pro-Kontext-Registrierung.
Diagnoselistener sind nicht für Protokollierung konzipiert. Einfache Protokollierung oder Microsoft.Extensions.Logging sind bessere Optionen für Protokollierung.
Weitere Informationen finden Sie unter Verwenden von Diagnoselistenern in EF Core.