14 h 02 : les paiements échouent. L'API signale un timeout Redis, le worker mentionne un deadlock MySQL, nginx affiche des 499 client disconnect. Trois ingénieurs ouvrent trois sessions SSH. Personne ne partage la même trace horaire — les logs nginx sont en heure locale, PHP en UTC mal configuré. Une heure passe avant de repérer un déploiement canary visible sur un seul des quatre nœuds.
Centraliser les logs ne sert pas à « avoir un joli tableau de bord ». C'est reconstruire une timeline unique quand la panne traverse load balancer, application, cache, file d'attente et base de données. Sans corrélation, vous empilez des monologues ; avec corrélation, vous lisez une histoire.
Chaîne de traitement : collecte, transport, stockage, requête
Une architecture type comprend un agent léger — Vector, Fluent Bit ou Filebeat — sur chaque VPS ou nœud Kubernetes. Le transport passe par HTTPS bulk ou, à grande échelle, Kafka. Le stockage choisit entre Loki, OpenSearch ou un service cloud de journalisation. L'interface — Grafana ou Kibana — permet la recherche et les alertes.
| Stack | Force | Coût / complexité |
|---|---|---|
| Loki + Grafana | Labels, intégration métriques | Modéré |
| ELK/OpenSearch | Recherche texte riche | Élevé |
| SaaS | Mise en route rapide | Volume €€, juridiction |
Sur un petit VPS, envoyer Vector vers Loki Cloud ou Grafana Cloud évite d'héberger Elasticsearch soi-même. Comparez les offres via l'annuaire et le comparateur.
Structuration, données personnelles et RGPD
Une ligne JSON par événement suffit : horodatage, niveau, service, request_id, message. Masquez ou pseudonymisez adresses IP et e-mails selon votre politique de rétention — les journaux peuvent contenir des données personnelles. Documentez durée et accès, surtout si vous utilisez un SaaS hors Union européenne.
Conservez aussi une rotation locale : un disque VPS plein coupe l'application avant que le central ne reçoive quoi que ce soit. Le central complète le local ; il ne le remplace pas pour la résilience immédiate.
Corrélation multi-services
Injectez et propagez un identifiant commun. nginx peut générer $request_id et le transmettre en amont. Laravel ou Symfony ajoutent le contexte dans le middleware. Le worker reçoit le même identifiant dans le payload du job. Un tableau de bord Grafana filtrant {req_id="abc"} traverse api, nginx et worker en une recherche.
Sous Kubernetes, combinez labels pod, namespace, container avec le request_id applicatif. Sans cette discipline, Kibana devient un défilement infini.
Rétention, coût et échantillonnage
Indexez tout en ERROR et WARN ; échantillonnez le DEBUG en production. Archivez vers un stockage objet froid pour la conformité longue. Alertez sur le taux d'erreurs, pas sur chaque ligne — sinon la fatigue d'alerte tue la vigilance.
Le sommet : des logs centralisés sans culture de contexte
La panne distribuée se comprend en timeline corrélée, pas en défilement infini dans une interface de recherche.
Décider et avancer sans angle mort
Standardisez d'abord le JSON structuré et imposez le request_id sur chaque service avant d'acheter plus de stockage. Déployez un agent léger sur chaque nœud et définissez une rétention en paliers — chaud court, archive longue selon audit. Rédigez un runbook incident : fenêtre temporelle, filtre service et niveau, regroupement par request_id, lien vers déploiement et métriques. Testez avec un exercice simulé : une requête bout-en-bout doit être retrouvable en une recherche — sinon corrigez la propagation d'identifiant avant d'investir davantage.
Questions fréquentes
ELK, Loki ou SaaS — que choisir ?
ELK ou OpenSearch excelles pour la recherche full-text, avec un coût RAM et disque élevé. Loki indexe les labels plutôt que le contenu — moins cher, efficace avec Prometheus. Un SaaS simplifie la mise en route, mais surveillez le volume facturé et la résidence des données en Union européenne.
Quel format de log viser ?
Du JSON structuré avec horodatage UTC, niveau, service, request_id et identifiant utilisateur si le RGPD le permet. Évitez les stack traces multilignes non parsées qui cassent la recherche.
Combien de temps retenir les logs ?
Gardez 7 à 30 jours en accès rapide pour le débogage d'incident, puis une archive de 90 jours à un an selon les obligations métier. Une rétention infinie augmente le coût et le risque RGPD.
Comment corréler app, nginx et worker ?
Propagez le même request_id — par exemple via l'en-tête X-Request-ID — du load balancer à PHP puis au job en file d'attente. Sans identifiant commun, centraliser ne centralise que du bruit.
Centraliser sert à reconstruire l'histoire — pas à archiver du bruit sans fil conducteur.