Utilisation d’un enregistreur d’événements pour ajouter des messages de journal personnalisés

Effectué

.NET fournit des API que vous pouvez utiliser pour journaliser les données de télémétrie personnalisées. OpenTelemetry peut exporter ces données.

Dans cette unité, vous allez apprendre à écrire du code efficace qui envoie des événements à des journaux structurés.

Objets ILogger

Les outils .NET Aspire configurent automatiquement l’API OpenTelemetry lorsque vous créez un projet en fonction des modèles ou ajoutez un projet existant à l’orchestration .NET Aspire. Lorsque vous souhaitez enregistrer des données de télémétrie, vous n’avez pas besoin de créer vos propres objets de journalisation, de métriques ou de suivi. Au lieu de cela, vous pouvez les récupérer à l’aide de l’injection de dépendances dans vos microservices.

Par exemple, dans la classe BasketService suivante, un objet ILogger est inclus dans la déclaration de la classe. Vous pouvez utiliser cet enregistreur d’événements n’importe où dans la classe pour écrire des événements :

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

Journalisation efficace

La journalisation permet de rendre votre microservice observable. Lorsque l’application est testée, pré-publiée et déployée en production, un code de journal complet peut permettre un diagnostic rapide des erreurs ou des goulots d’étranglement. Il est donc tentant de tout enregistrer. Toutefois, bien que la journalisation soit rapide, elle a un certain coût et vous devez faire attention à journaliser efficacement.

Les fournisseurs facturent généralement les systèmes de gestion des performances des applications (APM) en fonction du volume de données qu’ils ingèrent. La sélection du niveau de consignation approprié pour vos messages et les niveaux de collecte par défaut peuvent avoir un effet important sur la facture mensuelle. Les niveaux de collecte de journaux peuvent être définis par fournisseur, ce qui est généralement le nom de type utilisé dans ILogger<T>.

Utilisez les techniques suivantes chaque fois que vous journalisez :

  • Vérifiez que le niveau de journalisation que vous souhaitez utiliser est activé. Les niveaux disponibles incluent des informations, des avertissements, des erreurs et des critiques. Les administrateurs peuvent activer différents niveaux lors du test, de la pré-publication et du déploiement en production. La sortie de journal est contrôlée par le biais de IConfiguration, généralement à l’aide de appsettings.json ou de variables d’environnement.
  • Évitez l’interpolation de chaîne dans votre message journalisé. Les chaînes interpolées sont définies avec le symbole $ et sont évaluées même si votre niveau de journalisation choisi n’est pas activé. Au lieu de cela, utilisez une méthode de journal telle que LogInformation() ou LogDebug() et transmettez des paramètres dans la liste d’arguments.
  • Utilisez la génération de la source au moment de la compilation pour optimiser davantage les performances de journalisation et créer un identificateur unique pour chaque message de journal, ce qui est utile lors de l’interrogation des messages de journal dans un APM.

Génération de la source au moment de la compilation

La génération de source au moment de la compilation avec des objets ILogger réduit le coût de la journalisation en effectuant l’analyse de chaîne une seule fois, plutôt que sur chaque requête de journalisation. Elle inclut également un ID pour chaque type de message de journal. Pour utiliser cette technique, définissez des méthodes de journalisation partielles avec les paramètres de journalisation et appliquez le LoggerMessageAttribute à ces méthodes. .NET génère automatiquement la méthode de journalisation complète lorsque le code est compilé.

N’oubliez pas que dans .NET Aspire, vous n’avez pas besoin de créer un ILogger, mais vous pouvez l’obtenir à partir de l’injection de dépendances :

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

En savoir plus