Verwenden von Microsoft. Extensions. Logging in EF CoreUsing Microsoft.Extensions.Logging in EF Core

Microsoft. Extensions. Logging ist ein erweiterbarer Protokollierungs Mechanismus mit Plug-in-Anbietern für viele gängige Protokollierungs Systeme.Microsoft.Extensions.Logging is an extensible logging mechanism with plug-in providers for many common logging systems. Sowohl von Microsoft bereitgestellte Plug-ins (z. b. Microsoft. Extensions. Logging. Console) als auch Drittanbieter-Plug-ins (z. b. serilog. Extensions. Logging) sind als nuget-Pakete verfügbar.Both Microsoft-supplied plug-ins (e.g Microsoft.Extensions.Logging.Console) and third-party plug-ins (e.g. Serilog.Extensions.Logging) are available as NuGet packages.

Entity Framework Core (EF Core) ist vollständig in integriert Microsoft.Extensions.Logging .Entity Framework Core (EF Core) fully integrates with Microsoft.Extensions.Logging. Sie sollten jedoch die einfache Protokollierung für eine einfachere Methode zur Protokollierung verwenden, insbesondere für Anwendungen, die keine Abhängigkeitsinjektion verwenden.However, consider using simple logging for a simpler way to log, especially for applications that don't use dependency injection.

ASP.NET Core-AnwendungenASP.NET Core applications

Microsoft.Extensions.Logging wird standardmäßig in ASP.net Core Anwendungen verwendet.Microsoft.Extensions.Logging is used by default in ASP.NET Core applications. Aufrufen von AddDbContext oder AddDbContextPool .Calling AddDbContext or AddDbContextPool.

Andere Anwendungs TypenOther application types

Andere Anwendungs Typen können den generichost verwenden, um die gleichen Abhängigkeits einschleusungs Muster wie in ASP.net Core zu erhalten.Other application types can use the GenericHost to get the same dependency injection patterns as are used in ASP.NET Core. Adddbcontext oder adddbcontextpool kann dann wie in ASP.net Core Anwendungen verwendet werden.AddDbContext or AddDbContextPool can then be used just like in ASP.NET Core applications.

Microsoft.Extensions.Logging kann auch für Anwendungen verwendet werden, die keine Abhängigkeitsinjektion verwenden, obwohl die einfache Protokollierung einfacher einzurichten ist.Microsoft.Extensions.Logging can also be used for applications that don't use dependency injection, although simple logging can be easier to set up.

Microsoft.Extensions.Logging erfordert das Erstellen eines LoggerFactory .Microsoft.Extensions.Logging requires creation of a LoggerFactory. Diese Factory sollte als statische/globale Instanz an einem beliebigen Speicherort gespeichert werden und bei jeder Erstellung eines dbcontext verwendet werden.This factory should be stored as a static/global instance somewhere and used each time a DbContext is created. Beispielsweise ist es üblich, die Protokollierungs-Factory als statische Eigenschaft im dbcontext zu speichern.For example, it is common to store the logger factory as a static property on the DbContext.

public static readonly ILoggerFactory MyLoggerFactory
    = LoggerFactory.Create(builder => { builder.AddConsole(); });

Diese Singleton-/globale Instanz sollte dann bei EF Core auf dem registriert werden DbContextOptionsBuilder .This singleton/global instance should then be registered with EF Core on the DbContextOptionsBuilder. Beispiel:For example:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLoggerFactory(MyLoggerFactory)
        .UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFLogging;ConnectRetryCount=0");

Ausführliche Meldungen werden erhalten.Getting detailed messages

Tipp

On-Konfiguration wird immer noch aufgerufen, wenn adddbcontext verwendet wird oder eine dbcontextoptions-Instanz an den dbcontext-Konstruktor übergeben wird.OnConfiguring is still called when AddDbContext is used or a DbContextOptions instance is passed to the DbContext constructor. Dies ist der ideale Ort zum Anwenden der Kontext Konfiguration, unabhängig davon, wie der dbcontext erstellt wird.This makes it the ideal place to apply context configuration regardless of how the DbContext is constructed.

Sensible DatenSensitive data

Standardmäßig werden in EF Core die Werte von Daten in Ausnahme Meldungen nicht eingeschlossen.By default, EF Core will not include the values of any data in exception messages. Dies liegt daran, dass solche Daten möglicherweise vertraulich sind und in der Produktionsumgebung verwendet werden können, wenn eine Ausnahme nicht behandelt wird.This is because such data may be confidential, and could be revealed in production use if an exception is not handled.

Allerdings kann das Wissen von Datenwerten, insbesondere bei Schlüsseln, beim Debuggen sehr hilfreich sein.However, knowing data values, especially for keys, can be very helpful when debugging. Dies kann in EF Core aktiviert werden, indem aufgerufen wird EnableSensitiveDataLogging() .This can be enabled in EF Core by calling EnableSensitiveDataLogging(). Beispiel:For example:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.EnableSensitiveDataLogging();

Ausführliche Abfrage AusnahmenDetailed query exceptions

Aus Leistungsgründen wird von EF Core nicht jeder aufzurufende Befehl zum Lesen eines Werts vom Datenbankanbieter in einem try-catch-Block eingeschlossen.For performance reasons, EF Core does not wrap each call to read a value from the database provider in a try-catch block. Dies führt jedoch manchmal zu Ausnahmen, die schwer zu diagnostizieren sind, insbesondere dann, wenn die Datenbank einen NULL-Wert zurückgibt, wenn Sie vom Modell nicht zugelassen wird.However, this sometimes results in exceptions that are hard to diagnose, especially when the database returns a NULL when not allowed by the model.

Das aktivieren EnableDetailedErrors führt dazu, dass EF diese try-catch-Blöcke einführt und somit ausführlichere Fehler bereitstellt.Turning on EnableDetailedErrors will cause EF to introduce these try-catch blocks and thereby provide more detailed errors. Beispiel:For example:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.EnableDetailedErrors();

Konfiguration für bestimmte NachrichtenConfiguration for specific messages

Die EF Core- ConfigureWarnings API ermöglicht es Anwendungen, zu ändern, was geschieht, wenn ein bestimmtes Ereignis auftritt.The EF Core ConfigureWarnings API allows applications to change what happens when a specific event is encountered. Dies kann für Folgendes verwendet werden:This can be used to:

  • Ändern Sie die Protokollebene, bei der das Ereignis protokolliert wird.Change the log level at which the event is logged
  • Protokollierung des Ereignisses überspringenSkip logging the event altogether
  • Löst eine Ausnahme aus, wenn das Ereignis eintritt.Throw an exception when the event occurs

Ändern der Protokollebene für ein EreignisChanging the log level for an event

Manchmal kann es hilfreich sein, die vordefinierte Protokollebene für ein Ereignis zu ändern.Sometimes it can be useful to change the pre-defined log level for an event. Dies kann z. b. verwendet werden, um zwei weitere Ereignisse von auf heraufzustufen LogLevel.Debug LogLevel.Information :For example, this can be used to promote two additional events from LogLevel.Debug to LogLevel.Information:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .ConfigureWarnings(
            b => b.Log(
                (RelationalEventId.ConnectionOpened, LogLevel.Information),
                (RelationalEventId.ConnectionClosed, LogLevel.Information)));

Protokollierung eines Ereignisses unterdrückenSuppress logging an event

Auf ähnliche Weise kann ein einzelnes Ereignis aus der Protokollierung unterdrückt werden.In a similar way, an individual event can be suppressed from logging. Dies ist besonders nützlich, wenn eine Warnung ignoriert werden soll, die überprüft und verstanden wurde.This is particularly useful for ignoring a warning that has been reviewed and understood. Beispiel:For example:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .ConfigureWarnings(b => b.Ignore(CoreEventId.DetachedLazyLoadingWarning));

Auslösen für ein EreignisThrow for an event

Zum Schluss können EF Core so konfiguriert werden, dass für ein bestimmtes Ereignis ausgelöst wird.Finally, EF Core can be configured to throw for a given event. Dies ist besonders nützlich, um eine Warnung in einen Fehler zu ändern.This is particularly useful for changing a warning into an error. (Dies war tatsächlich der ursprüngliche Zweck der- ConfigureWarnings Methode, daher der Name.) Zum Beispiel:(Indeed, this was the original purpose of ConfigureWarnings method, hence the name.) For example:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .ConfigureWarnings(b => b.Throw(RelationalEventId.QueryPossibleUnintendedUseOfEqualsWarning));

Filterung und andere KonfigurationFiltering and other configuration

Anleitungen zur Protokollfilterung und anderen Konfigurationen finden Sie unter Protokollierung in .net .See Logging in .NET for guidance on log filtering and other configuration.

EF Core Protokollierungs Ereignisse werden in einer der folgenden-Ereignisse definiert:EF Core logging events are defined in one of:

  • CoreEventId für Ereignisse, die für alle EF Core Datenbankanbieter üblich sindCoreEventId for events common to all EF Core database providers
  • RelationalEventId für Ereignisse, die allen relationalen Datenbankanbietern gemeinsam sindRelationalEventId for events common to all relational database providers
  • Eine ähnliche Klasse für Ereignisse, die für den aktuellen Datenbankanbieter spezifisch sind.A similar class for events specific to the current database provider. Beispielsweise SqlServerEventId für den SQL Server-Anbieter.For example, SqlServerEventId for the SQL Server provider.

Diese Definitionen enthalten die Ereignis-IDs, die Protokollebene und die Kategorie für jedes Ereignis, wie von verwendet Microsoft.Extensions.Logging .These definitions contain the event IDs, log level, and category for each event, as used by Microsoft.Extensions.Logging.