Retour à l'accueil

Journaux JSON structurés : Un guide pour les développeurs

L'article fournit un guide pratique pour implémenter une journalisation efficace dans les systèmes distribués. Il couvre les journaux structurés au format JSON, l'utilisation du contexte MDC pour transmettre les identifiants métier, la séparation appropriée des niveaux erreur et avertissement, ainsi qu'un schéma de journalisation unifié des points d'entrée (entrypoints).

Comment écrire correctement les journaux : Un guide complet pour les développeurs
Advertisement 728x90

Logs structurés JSON : Guide pratique pour développeurs

La journalisation est un pilier essentiel de l'observabilité dans les systèmes distribués modernes. Contrairement aux métriques et traces, les logs offrent la plus grande flexibilité pour analyser les événements applicatifs. Ce guide présente des patterns concrets pour implémenter une journalisation efficace avec format JSON structuré, contexte MDC et séparation claire des niveaux d'erreur.

Pourquoi les logs structurés surpassent le texte brut

Les logs en texte brut traditionnels sont faciles à lire en console, mais posent de gros problèmes pour le traitement automatisé. Leur parsing nécessite des regex complexes, l'extraction de données spécifiques est laborieuse, et toute modification de format tourne au cauchemar. Dans les systèmes distribués où les incidents exigent une analyse rapide sur plusieurs sources, ces lacunes deviennent inacceptables.

Les logs JSON structurés résolvent ces problèmes :

Google AdInline article slot
  • Simplifient la recherche et le filtrage par champs spécifiques
  • Permettent l'indexation partielle dans les systèmes de recherche
  • Automatisent l'extraction de données post-incident
  • Facilitent le filtrage des données personnelles et l'ajout de métadonnées

Exemple de log texte brut inefficace :

2025-03-15 10:16:01.795 INFO 12345 --- [nio-8080-exec-1] c.e.UserController : User saved to DB: User{id=123, [email protected], role=USER}

Exemple de log JSON structuré :

{
  "timestamp": "2025-03-22T10:15:30.123Z",
  "level": "ERROR",
  "service": "auth-service",
  "traceId": "1fd7a997-6517-4b63-9baa-4238f8012734",
  "entrypoint": "HTTP request POST /api/user/auth",
  "message": "Échec d'authentification utilisateur",
  "user_id": "user-789",
  "error": {
    "type": "InvalidCredentials",
    "details": "Mot de passe fourni ne correspond pas"
  }
}

Contexte de diagnostic mappé pour le tracing end-to-end

Le Mapped Diagnostic Context (MDC) de SLF4J résout le défi de propager les infos contextuelles à travers les chaînes d'appels. Fini le passage manuel des ID dans chaque méthode : le MDC lie les données au thread d'exécution courant.

Google AdInline article slot

Aspects clés de l'usage du MDC :

  • Identifiants métier — user_id, order_id, transaction_id
  • Contexte technique — traceId, spanId pour le tracing
  • Métadonnées d'entrée — type d'entrypoint, numéro de tentative de retry
  • Nettoyage automatique — toujours vider le contexte après traitement de la requête

Le MDC excelle aux entrypoints, où les ID métier doivent être disponibles dès le départ — souvent extraits des headers avant lecture du payload.

Entrypoints et leur journalisation

Un entrypoint (EP) est l'abstraction pour lancer l'exécution de la logique métier. Types courants dans les apps modernes :

Google AdInline article slot
  • Serveurs HTTP/REST
  • Serveurs gRPC
  • Consommateurs Kafka
  • Tâches cron et planifiées
  • Écouteurs de files de messages

Chaque EP doit suivre un schéma de journalisation cohérent :

  • Entrées — métadonnées de requête et payload
  • Contexte d'exécution — ID métier, paramètres techniques
  • Sorties — résultat du traitement ou erreur
  • Statut — succès/échec en tenant compte des retries

Séparation des erreurs et avertissements en systèmes distribués

Les retries sont la norme pour la résilience en systèmes distribués, façonnant directement la stratégie de journalisation :

Utiliser le niveau WARN pour :

  • Erreurs sur tentatives intermédiaires de retry
  • Pannes transitoires corrigibles par retry
  • Problèmes ne nécessitant pas d'attention immédiate des opérateurs

Réserver le niveau ERROR pour :

  • Tentatives finales échouées
  • Erreurs critiques rendant les retries inutiles
  • Situations exigeant une intervention immédiate

Numéroter les retries de haut en bas (ex. : 2 → 1 → 0), où 0 est la dernière tentative. Cela simplifie le filtrage des erreurs finales.

Implémentation pratique avec intercepteurs

Les frameworks modernes proposent des intercepteurs pour les préoccupations transversales. Flux de journalisation des entrypoints via intercepteurs :

  • Init contexte — définir traceId, spanId dans le MDC
  • Log entrée — capturer métadonnées et entrées
  • Traiter requête — exécuter logique métier avec propagation auto du MDC
  • Log sortie — enregistrer résultat ou erreur
  • Nettoyer contexte — vider toutes les données MDC

Éléments clés d'implémentation :

  • Intercepteurs de log entrée/sortie par type d'EP
  • Intégration tracing (Jaeger, Zipkin)
  • Extraction auto des ID métier des headers
  • Sérialisation JSON cohérente des logs

Champs obligatoires dans les logs structurés

Pour la cohérence et l'analyse aisée, chaque log doit inclure :

  • Champs techniques de base

- timestamp au format ISO-8601

- niveau de log (ERROR, WARN, INFO, DEBUG)

- nom et version du service

- ID d'instance d'app

  • Contexte d'exécution

- traceId et spanId pour corrélation de requêtes

- requestId

- type et nom d'entrypoint

- nombre de retries

  • Contexte métier

- ID métier clés (user_id, order_id, etc.)

- métadonnées de requête (méthode HTTP, endpoint, groupe de consommateurs)

- environnement (stage, région, cluster)

  • Données d'événement

- message lisible par l'humain

- détails d'événement structurés

- stacktrace d'erreur (pour ERROR)

- durée (pour logs EP)

Intégration avec l'écosystème d'observabilité

Les logs structurés ne sont pas isolés — ils font partie d'une observabilité complète :

Corrélation métriques :

  • ID partagés entre logs et métriques
  • Lier logs d'erreur aux métriques de taux d'erreur
  • Utiliser logs pour contextualiser anomalies métriques

Intégration tracing :

  • traceId/spanId unifiés entre logs et traces
  • Enrichir traces avec détails de logs
  • Déboguer spans spécifiques via logs

Traitement automatisé :

  • Alertes basées sur patterns de logs
  • Crochets vers systèmes de gestion d'incidents
  • Extraction auto de données pour récupération

Points clés à retenir

  • Logs JSON structurés fournissent un format lisible par machine pour un traitement et analyse automatisés fluides.
  • Contexte MDC propage les ID métier à travers les chaînes d'appels sans modifier les signatures de méthodes.
  • Séparation claire erreur/avis supporte la logique de retry et réduit le bruit de monitoring.
  • Schéma unifié de journalisation EP garantit la cohérence pour l'analyse des transactions distribuées.
  • Ensemble standard de champs permet la corrélation d'événements et la recherche efficace.

— Editorial Team

Advertisement 728x90

Lire ensuite