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 :
- 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.
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 :
- 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
Aucun commentaire pour le moment.