Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Microsoft.Extensions.Logging je rozšiřitelný mechanismus protokolování s poskytovateli modulů plug-in pro mnoho běžných systémů protokolování. 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
se ve výchozím nastavení používá v aplikacích ASP.NET Core. Volání AddDbContext nebo AddDbContextPool způsobí, že EF Core automaticky použije 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í injektování závislostí, i když může být jednodušší nastavit jednoduché logování.
Microsoft.Extensions.Logging vyž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 přirozené ukládat továrnu loggerů jako statickou vlastnost na 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 DbContextOptionsBuilder. Například:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLoggerFactory(MyLoggerFactory)
.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
Získání podrobných zpráv
Návod
OnConfiguring je stále volán, když je použito AddDbContext nebo když je instance DbContextOptions předána konstruktoru DbContext. 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(). Napří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 integruje tyto bloky try-catch a poskytne tak podrobnější popis chyb. Napří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čit protokolování události úplně
- 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 propagaci dvou dalších událostí 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)));
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é. Napří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.) Napří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.