Korzystanie z pliku Microsoft.Extensions.Logging w programie EF Core

Microsoft.Extensions.Logging to rozszerzalny mechanizm rejestrowania z dostawcami wtyczek dla wielu typowych systemów rejestrowania. Wtyczki dostarczane przez firmę Microsoft (np . Microsoft.Extensions.Logging.Console) i wtyczki innych firm (np. Serilog.Extensions.Logging) są dostępne jako pakiety NuGet.

Program Entity Framework Core (EF Core) w pełni integruje się z Microsoft.Extensions.Loggingprogramem . Należy jednak rozważyć użycie prostego rejestrowania, aby uzyskać prostszy sposób rejestrowania , zwłaszcza w przypadku aplikacji, które nie używają wstrzykiwania zależności.

aplikacje ASP.NET Core

Microsoft.Extensions.Logging jest używany domyślnie w aplikacjach ASP.NET Core. Wywoływanie AddDbContext lub AddDbContextPool sprawia, że program EF Core automatycznie używa konfiguracji rejestrowania skonfigurowanej za pośrednictwem zwykłego mechanizmu ASP.NET.

Inne typy aplikacji

Inne typy aplikacji mogą używać metody GenericHost , aby uzyskać te same wzorce iniekcji zależności, które są używane w ASP.NET Core. AddDbContext lub AddDbContextPool może być używany podobnie jak w aplikacjach ASP.NET Core.

Microsoft.Extensions.Logging można również używać w przypadku aplikacji, które nie używają wstrzykiwania zależności, chociaż proste rejestrowanie może być łatwiejsze do skonfigurowania.

Microsoft.Extensions.Logging wymaga utworzenia obiektu LoggerFactory. Ta fabryka powinna być przechowywana jako wystąpienie statyczne/globalne w dowolnym miejscu i używana za każdym razem, gdy tworzony jest obiekt DbContext. Na przykład często jest przechowywać fabrykę rejestratora jako właściwość statyczną w obiekcie DbContext.

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

To pojedyncze/globalne wystąpienie powinno być następnie zarejestrowane w programie EF Core w systemie DbContextOptionsBuilder. Przykład:

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

Uzyskiwanie szczegółowych komunikatów

Napiwek

Funkcja OnConfiguring jest nadal wywoływana, gdy jest używany element AddDbContext lub wystąpienie DbContextOptions jest przekazywane do konstruktora DbContext. Dzięki temu idealnie nadaje się do zastosowania konfiguracji kontekstu niezależnie od sposobu konstruowania obiektu DbContext.

Dane poufne

Domyślnie program EF Core nie będzie zawierać wartości żadnych danych w komunikatach o wyjątkach. Wynika to z faktu, że takie dane mogą być poufne i mogą być ujawniane w użyciu produkcyjnym, jeśli wyjątek nie jest obsługiwany.

Jednak znajomość wartości danych, szczególnie w przypadku kluczy, może być bardzo przydatna podczas debugowania. Tę funkcję można włączyć w programie EF Core, wywołując polecenie EnableSensitiveDataLogging(). Przykład:

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

Szczegółowe wyjątki zapytań

Ze względu na wydajność program EF Core nie opakowuje każdego wywołania w celu odczytania wartości od dostawcy bazy danych w bloku try-catch. Jednak czasami skutkuje to wyjątkami, które są trudne do zdiagnozowania, zwłaszcza gdy baza danych zwraca wartość NULL, gdy model nie jest dozwolony.

EnableDetailedErrors Włączenie spowoduje, że program EF wprowadzi te bloki try-catch, a tym samym zapewni bardziej szczegółowe błędy. Przykład:

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

Konfiguracja określonych komunikatów

Interfejs API platformy EF Core ConfigureWarnings umożliwia aplikacjom zmianę tego, co się stanie po napotkaniu określonego zdarzenia. Może to służyć do:

  • Zmienianie poziomu dziennika, na którym rejestrowane jest zdarzenie
  • Pomiń rejestrowanie zdarzenia całkowicie
  • Zgłaszanie wyjątku w przypadku wystąpienia zdarzenia

Zmiana poziomu dziennika dla zdarzenia

Czasami może być przydatne zmiana wstępnie zdefiniowanego poziomu dziennika dla zdarzenia. Na przykład może to służyć do podwyższania poziomu dwóch dodatkowych zdarzeń z LogLevel.Debug do :LogLevel.Information

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

Pomijanie rejestrowania zdarzenia

W podobny sposób pojedyncze zdarzenie może zostać pominięte podczas rejestrowania. Jest to szczególnie przydatne w przypadku ignorowania ostrzeżenia, które zostało poddane przeglądowi i zrozumieniu. Przykład:

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

Zgłaszanie zdarzenia

Na koniec program EF Core można skonfigurować do zgłaszania dla danego zdarzenia. Jest to szczególnie przydatne w przypadku zmiany ostrzeżenia na błąd. (Rzeczywiście, był to pierwotny cel ConfigureWarnings metody, stąd nazwa). Na przykład:

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

Filtrowanie i inna konfiguracja

Aby uzyskać wskazówki dotyczące filtrowania dzienników i innych konfiguracji, zobacz Rejestrowanie na platformie .NET .

Zdarzenia rejestrowania platformy EF Core są definiowane w jednej z:

  • CoreEventId dla zdarzeń typowych dla wszystkich dostawców baz danych EF Core
  • RelationalEventId dla zdarzeń wspólnych dla wszystkich dostawców relacyjnej bazy danych
  • Podobna klasa dla zdarzeń specyficznych dla bieżącego dostawcy bazy danych. Na przykład SqlServerEventId dla dostawcy programu SQL Server.

Te definicje zawierają identyfikatory zdarzeń, poziom dziennika i kategorię dla każdego zdarzenia, które są używane przez Microsoft.Extensions.Loggingprogram .