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 suivante BasketService , un ILogger objet est inclus dans la déclaration de 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éparée et déployée en production, une journalisation complète peut permettre un diagnostic rapide des défauts ou des goulots d’étranglement. Il est donc tentant de tout consigner. Toutefois, bien que la journalisation soit rapide, elle n’a pas de coût nul, et vous devez être prudent pour journaliser efficacement.

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

Utilisez les techniques suivantes chaque fois que vous connectez :

  • 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éproduction et du déploiement en production. La sortie de journal est contrôlée via IConfiguration, généralement à l’aide de appsettings.json ou de variables d’environnement.
  • Évitez l’interpolation de chaîne dans votre message de journalisation. 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 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 code au moment de la compilation avec des objets ILogger réduit le coût de la journalisation en analysant les chaînes de caractères une seule fois, plutôt que sur chaque demande de journalisation. Il 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, puis appliquez le LoggerMessageAttribute à celles-ci. .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);
}

Pour en savoir plus