Použití Microsoft.Extensions.Logging v EF Core

Microsoft.Extensions.Logging je rozšiřitelný mechanismus protokolování s poskytovateli modulů plug-in pro řadu běžných protokolovacích systémů. Moduly plug-in dodané společností Microsoft (např . Microsoft.Extensions.Logging.Console) i moduly plug-in třetích stran (např. Serilog.Extensions.Logging) jsou k dispozici jako balíčky NuGet.

Entity Framework Core (EF Core) se plně integruje s Microsoft.Extensions.Logging. Zvažte použití jednoduchého protokolování pro jednodušší způsob protokolování , zejména pro aplikace, které nepoužívají injektáž závislostí.

aplikace ASP.NET Core

Microsoft.Extensions.Logging ve výchozím nastavení se používá v aplikacích ASP.NET Core. Volání AddDbContext nebo AddDbContextPool nastavení EF Core automaticky používá nastavení protokolování nakonfigurované prostřednictvím běžného mechanismu ASP.NET.

Jiné typy aplikací

Jiné typy aplikací můžou použít GenericHost k získání stejných vzorů injektáže závislostí, jaké se používají v ASP.NET Core. AddDbContext nebo AddDbContextPool je pak možné použít stejně jako v aplikacích ASP.NET Core.

Microsoft.Extensions.Logging lze také použít pro aplikace, které nepoužívají injektáž závislostí, i když jednoduché protokolování může být jednodušší nastavit.

Microsoft.Extensions.Loggingvyžaduje vytvoření .LoggerFactory Tato továrna by měla být někde uložena jako statická nebo globální instance a použita při každém vytvoření DbContext. Je například běžné ukládat objekt pro vytváření protokolovacího nástroje jako statickou vlastnost v DbContext.

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

Tato singletonová/globální instance by se pak měla zaregistrovat v EF Core na zařízení DbContextOptionsBuilder. Příklad:

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

Získání podrobných zpráv

Tip

OnConfiguring je stále volána, když AddDbContext je použit nebo DbContextOptions instance je předán DbContext konstruktoru. Díky tomu je ideálním místem pro použití konfigurace kontextu bez ohledu na to, jak je dbContext vytvořen.

Citlivá data

Ef Core ve výchozím nastavení nebude obsahovat hodnoty žádných dat ve zprávách výjimek. Důvodem je to, že taková data mohou být důvěrná a mohou být odhalena v produkčním použití, pokud není zpracována výjimka.

Znalost hodnot dat, zejména pro klíče, ale může být při ladění velmi užitečná. To lze povolit v EF Core voláním EnableSensitiveDataLogging(). Příklad:

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

Podrobné výjimky dotazů

Z důvodů výkonu EF Core nezabalí každé volání pro čtení hodnoty od zprostředkovatele databáze v bloku try-catch. To ale někdy vede k výjimkám, které je obtížné diagnostikovat, zejména v případě, že databáze vrátí hodnotu NULL, pokud model nepovoluje.

Zapnutí EnableDetailedErrors způsobí, že EF zavede tyto bloky try-catch a poskytne tak podrobnější chyby. Příklad:

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

Konfigurace pro konkrétní zprávy

Rozhraní EF Core ConfigureWarnings API umožňuje aplikacím změnit, co se stane, když dojde k určité události. Můžete ho použít k:

  • Změna úrovně protokolu, na které se událost protokoluje
  • Přeskočení protokolování události celkem
  • Vyvolání výjimky při výskytu události

Změna úrovně protokolu pro událost

Někdy může být užitečné změnit předem definovanou úroveň protokolu události. Můžete ho například použít k povýšení dvou dalších událostí z LogLevel.DebugLogLevel.Information:

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

Potlačení protokolování události

Podobně může být jednotlivá událost potlačena z protokolování. To je užitečné zejména pro ignorování upozornění, které bylo zkontrolováno a srozumitelné. Příklad:

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

Vyvolání události

Nakonec je možné ef Core nakonfigurovat tak, aby se pro danou událost vyhodila. To je užitečné zejména při změně upozornění na chybu. (To byl původní účel ConfigureWarnings metody, tedy název.) Příklad:

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

Filtrování a další konfigurace

Pokyny k filtrování protokolů a další konfiguraci najdete v tématu Protokolování v .NET .

Události protokolování EF Core jsou definovány v jednom z těchto:

  • CoreEventId pro události společné pro všechny poskytovatele databáze EF Core
  • RelationalEventId pro události společné pro všechny zprostředkovatele relačních databází
  • Podobná třída pro události specifické pro aktuálního poskytovatele databáze. Například SqlServerEventId pro poskytovatele SQL Serveru.

Tyto definice obsahují ID událostí, úroveň protokolu a kategorii pro každou událost, jak je používá Microsoft.Extensions.Logging.