Een logboekregistratie gebruiken om aangepaste logboekberichten toe te voegen

Voltooid

.NET biedt API's die u kunt gebruiken om aangepaste telemetriegegevens te registreren. OpenTelemetry kan die gegevens exporteren.

In deze les leert u hoe u efficiënte code schrijft waarmee gebeurtenissen naar gestructureerde logboeken worden verzonden.

ILogger-objecten

Met de .NET Aspire-hulpprogramma's wordt de OpenTelemetry-API automatisch ingesteld wanneer u een project maakt op basis van de sjablonen of een bestaand project toevoegt aan .NET Aspire-indeling. Wanneer u telemetrie wilt vastleggen, hoeft u geen eigen logboekregistratie, metrische gegevens of traceringsobjecten te maken. In plaats daarvan kunt u ze ophalen met behulp van afhankelijkheidsinjectie in uw microservices.

In de volgende BasketService klasse wordt bijvoorbeeld een ILogger object opgenomen in de klassedeclaratie. U kunt die logboekregistratie overal in de klasse gebruiken om gebeurtenissen te schrijven:

public class BasketService(
    IBasketRepository repository,
    ILogger<BasketService> logger) : Basket.BasketBase
{
    [AllowAnonymous]
    public override async Task<CustomerBasketResponse> GetBasket(
	    GetBasketRequest request, ServerCallContext context)
    {
        var userId = context.GetUserIdentity();

        // Use the logger to write events
        if (logger.IsEnabled(LogLevel.Debug))
        {
            logger.LogDebug("Begin GetBasketById call from method {Method} for basket id {userId}", context.Method, userId);
        }

        var data = await repository.GetBasketAsync(userId);

        return new();
    }
}

Efficiënte logboekregistratie

Logboekregistratie helpt om uw microservice waarneembaar te maken. Wanneer de app is getest, gefaseerd en geïmplementeerd in productie, kan een grondige logboekcode snelle diagnose van fouten of knelpunten mogelijk maken. Het is daarom verleidelijk om alles te registreren. Hoewel logboekregistratie snel is, zijn er geen kosten zonder kosten en moet u voorzichtig zijn om efficiënt te registreren.

Leveranciers factureren doorgaans APM-systemen (Application Performance Management) op basis van het gegevensvolume dat ze opnemen. Het selecteren van het juiste logboekniveau voor uw berichten en de standaardverzamelingsniveaus kunnen een groot effect hebben op de maandelijkse factuur. Logboekverzamelingsniveaus kunnen per provider worden ingesteld. Dit is meestal de typenaam waarin ILogger<T>wordt gebruikt.

Gebruik de volgende technieken telkens wanneer u zich aanmeldt:

  • Controleer of het logboekregistratieniveau dat u wilt gebruiken, is ingeschakeld. Beschikbare niveaus omvatten informatie, waarschuwing, fout en kritiek. Beheerders kunnen verschillende niveaus inschakelen bij het testen, faseren en implementeren in productie. Logboekuitvoer wordt beheerd via IConfiguration, meestal met behulp van appsettings.json of omgevingsvariabelen.
  • Vermijd tekenreeksinterpolatie in het vastgelegde bericht. Geïnterpoleerde tekenreeksen worden gedefinieerd met het $ symbool en worden geëvalueerd, zelfs als het gekozen logboekregistratieniveau niet is ingeschakeld. Gebruik in plaats daarvan een logboekmethode, zoals LogInformation() of LogDebug() en geef parameters door in de lijst met argumenten.
  • Gebruik het genereren van compilatietijdbronnen om de logboekprestaties verder te optimaliseren en een unieke id te maken voor elk logboekbericht, wat handig is bij het opvragen van logboekberichten in een APM.

Tijdbron genereren compileren

Het genereren van tijdbronnen compileren met ILogger objecten vermindert de kosten van logboekregistratie door de tekenreeksanalyse eenmaal uit te voeren, in plaats van bij elke logboekregistratieaanvraag. Het bevat ook een id voor elk type logboekbericht. Als u deze techniek wilt gebruiken, definieert u gedeeltelijke logboekregistratiemethoden met de logboekparameters en past u deze LoggerMessageAttribute toe. .NET genereert automatisch de volledige logboekregistratiemethode wanneer de code wordt gecompileerd.

Houd er rekening mee dat u in .NET Aspire geen ILogger hoeft te maken, maar in plaats daarvan kunt u het ophalen van afhankelijkheidsinjectie:

public partial class BasketService(
    IBasketRepository repository,
    ILogger<BasketService> logger) : Basket.BasketBase
{
    [LoggerMessage(
        EventId = 0,
        Level = LogLevel.Information,
        Message = "Obtaining a basket from method {Method} for basket {basketId}")]
    public partial void LogGetBasket(string Method, int basketId);
}

Meer informatie