Přidání vlastních zpráv protokolu pomocí protokolovacího nástroje

Dokončeno

.NET poskytuje rozhraní API, která můžete použít k protokolování přizpůsobených telemetrických dat. OpenTelemetry může tato data exportovat.

V této lekci se dozvíte, jak napsat efektivní kód, který odesílá události do strukturovaných protokolů.

Objekty ILogger

Nástroje .NET Aspire nastaví rozhraní API OpenTelemetry automaticky při vytváření projektu na základě šablon nebo přidání existujícího projektu do orchestrace .NET Aspire. Pokud chcete zaznamenávat telemetrii, nemusíte vytvářet vlastní objekty protokolování, metriky nebo trasování. Místo toho je můžete načíst pomocí injektáže závislostí v mikroslužbách.

Například v následující BasketService třídě ILogger je objekt součástí deklarace třídy. K zápisu událostí můžete použít protokolovací nástroj kdekoli ve třídě:

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();
    }
}

Efektivní protokolování

Protokolování pomáhá zajistit pozorovatelnou mikroslužbu. Při testování, fázování a nasazení aplikace do produkčního prostředí může důkladný kód protokolu umožnit rychlou diagnostiku chyb nebo kritických bodů. Je proto lákavé protokolovat všechno. I když je protokolování rychlé, nemá žádné náklady a měli byste být opatrní při efektivním protokolování.

Dodavatelé často fakturují systémy správy výkonu aplikací (APM) na základě objemu dat, která ingestují. Výběr odpovídající úrovně protokolu pro vaše zprávy a výchozí úrovně shromažďování můžou mít velký vliv na měsíční vyúčtování. Úrovně shromažďování protokolů lze nastavit pro jednotlivé zprostředkovatele, což je obvykle název typu použitý v ILogger<T>.

Při každém protokolování použijte následující techniky:

  • Zkontrolujte, jestli je povolená úroveň protokolování, kterou chcete použít. Mezi dostupné úrovně patří informace, upozornění, chyba a kritické. Správci můžou při testování, přípravě a nasazování do produkčního prostředí povolit různé úrovně. Výstup protokolu se řídí prostřednictvím IConfiguration, obvykle pomocí appsettings.json proměnných prostředí nebo proměnných prostředí.
  • Vyhněte se interpolaci řetězců v protokolované zprávě. Interpolované řetězce se definují pomocí symbolu $ a vyhodnocují se i v případě, že vybraná úroveň protokolování není povolená. Místo toho použijte metodu protokolu, například LogInformation() nebo LogDebug() předávat parametry v seznamu argumentů.
  • Generování zdroje času kompilace slouží k další optimalizaci výkonu protokolování a vytvoření jedinečného identifikátoru pro každou zprávu protokolu, což je užitečné při dotazování na zprávy protokolu v APM.

Generování zdroje času kompilace

Generování zdroje času kompilace s ILogger objekty snižuje náklady na protokolování tím, že provádí analýzu řetězců jednou místo u každého požadavku protokolování. Obsahuje také ID pro každý typ zprávy protokolu. Chcete-li použít tuto techniku, definujte částečné metody protokolování s parametry protokolování a použijte je LoggerMessageAttribute na ně. .NET při kompilaci kódu automaticky vygeneruje úplnou metodu protokolování.

Nezapomeňte, že v rozhraní .NET Aspire nemusíte vytvářet ILogger, ale místo toho ho můžete získat z injektáže závislostí:

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);
}

Další informace