Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Microsoft.Extensions.Logging is een uitbreidbaar logboekregistratiemechanisme met invoegtoepassingsproviders voor veel algemene logboekregistratiesystemen. Zowel door Microsoft geleverde invoegtoepassingen (zoals Microsoft.Extensions.Logging.Console) als invoegtoepassingen van derden (bijvoorbeeld Serilog.Extensions.Logging) zijn beschikbaar als NuGet-pakketten.
Entity Framework Core (EF Core) is volledig geïntegreerd met Microsoft.Extensions.Logging. Overweeg echter om eenvoudige logboekregistratie te gebruiken voor een eenvoudigere manier om te registreren, met name voor toepassingen die geen afhankelijkheidsinjectie gebruiken.
ASP.NET Core-toepassingen
Microsoft.Extensions.Logging wordt standaard gebruikt in ASP.NET Core-toepassingen. EF Core aanroepen AddDbContext of AddDbContextPool maakt automatisch gebruik van de logging die is ingesteld via het gebruikelijke ASP.NET-mechanisme.
Andere toepassingstypen
Andere toepassingstypen kunnen genericHost gebruiken om dezelfde patronen voor afhankelijkheidsinjectie op te halen als worden gebruikt in ASP.NET Core. AddDbContext of AddDbContextPool kan vervolgens net als in ASP.NET Core-toepassingen worden gebruikt.
Microsoft.Extensions.Logging kan ook worden gebruikt voor toepassingen die geen afhankelijkheidsinjectie gebruiken, hoewel eenvoudige logboekregistratie eenvoudiger kan worden ingesteld.
Microsoft.Extensions.Logging vereist het maken van een LoggerFactory. Deze factory moet ergens als een statisch/globaal exemplaar worden opgeslagen en elke keer dat een DbContext wordt gemaakt, worden gebruikt. Het is bijvoorbeeld gebruikelijk om de logger factory op te slaan als een statische eigenschap op dbContext.
public static readonly ILoggerFactory MyLoggerFactory
= LoggerFactory.Create(builder => { builder.AddConsole(); });
Dit singleton- of globale exemplaar moet vervolgens bij EF Core geregistreerd worden op de DbContextOptionsBuilder. Voorbeeld:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLoggerFactory(MyLoggerFactory)
.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
Gedetailleerde berichten ontvangen
Aanbeveling
OnConfiguring wordt nog steeds aangeroepen wanneer AddDbContext wordt gebruikt of als een DbContextOptions-exemplaar wordt doorgegeven aan de DbContext-constructor. Dit maakt het de ideale plek om contextconfiguratie toe te passen, ongeacht hoe dbContext wordt samengesteld.
Gevoelige gegevens
EF Core bevat standaard niet de waarden van gegevens in uitzonderingsberichten. Dit komt doordat dergelijke gegevens mogelijk vertrouwelijk zijn en kunnen worden weergegeven in productiegebruik als er geen uitzondering wordt verwerkt.
Het is echter handig als u gegevenswaarden kent, met name voor sleutels, wanneer u fouten opspoort. Dit kan worden ingeschakeld in EF Core door aan te roepen EnableSensitiveDataLogging(). Voorbeeld:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.EnableSensitiveDataLogging();
Gedetailleerde query-uitzonderingen
Vanwege prestatieredenen verpakt EF Core elke aanroep om een waarde van de databaseprovider te lezen niet in een try-catch-blok. Dit leidt echter soms tot uitzonderingen die moeilijk te diagnosticeren zijn, met name wanneer de database een NULL retourneert wanneer dit niet is toegestaan door het model.
Het inschakelen van EnableDetailedErrors zorgt ervoor dat EF deze try-catch-blokken introduceert en daardoor meer gedetailleerde fouten verstrekt. Voorbeeld:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.EnableDetailedErrors();
Configuratie voor specifieke berichten
Met de EF Core-API ConfigureWarnings kunnen toepassingen wijzigen wat er gebeurt wanneer er een specifieke gebeurtenis wordt aangetroffen. Dit kan worden gebruikt voor het volgende:
- Het logboekniveau wijzigen waarop de gebeurtenis wordt vastgelegd
- Logboekregistratie van de gebeurtenis overslaan
- Een uitzondering genereren wanneer de gebeurtenis plaatsvindt
Het logboekniveau voor een gebeurtenis wijzigen
Soms kan het handig zijn om het vooraf gedefinieerde logboekniveau voor een gebeurtenis te wijzigen. Dit kan bijvoorbeeld worden gebruikt om twee extra gebeurtenissen te promoten van LogLevel.Debug naar LogLevel.Information:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(
b => b.Log(
(RelationalEventId.ConnectionOpened, LogLevel.Information),
(RelationalEventId.ConnectionClosed, LogLevel.Information)));
Logboekregistratie van een gebeurtenis onderdrukken
Op een vergelijkbare manier kan een afzonderlijke gebeurtenis worden onderdrukt door logboekregistratie. Dit is met name handig voor het negeren van een waarschuwing die is beoordeeld en begrepen. Voorbeeld:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(b => b.Ignore(CoreEventId.DetachedLazyLoadingWarning));
Gooien voor een gebeurtenis
Ten slotte kan EF Core zo worden geconfigureerd dat het bij een bepaalde gebeurtenis een uitzondering opwerpt. Dit is met name handig voor het wijzigen van een waarschuwing in een fout. (Dit was inderdaad het oorspronkelijke doel van ConfigureWarnings de methode, vandaar de naam.) Bijvoorbeeld:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(b => b.Throw(RelationalEventId.QueryPossibleUnintendedUseOfEqualsWarning));
Filteren en andere configuratie
Zie Logboekregistratie in .NET voor hulp bij het filteren van logboeken en andere configuraties.
Ef Core-logboekregistratie-gebeurtenissen worden gedefinieerd in een van:
- CoreEventId voor gebeurtenissen die gebruikelijk zijn voor alle EF Core-databaseproviders
- RelationalEventId voor gebeurtenissen die voor alle relationele databaseproviders gelden
- Een vergelijkbare klasse voor gebeurtenissen die specifiek zijn voor de huidige databaseprovider. Bijvoorbeeld SqlServerEventId voor de SQL Server-provider.
Deze definities bevatten de gebeurtenis-id's, het logboekniveau en de categorie voor elke gebeurtenis, zoals wordt gebruikt door Microsoft.Extensions.Logging.