Des logs qui servent à quelque chose
En incident, les logs sont ton seul témoin.
Prérequis : cours 1.1 (journalctl) et 2.2 (compose).
Pourquoi
En incident, les logs sont ton seul témoin. Des logs verbeux mais vides (« error: undefined »), des secrets qui fuient dedans, ou 50 Go qui remplissent le disque : trois façons classiques de rater le moment où ça compte.
Concepts
- Ligne structurée : timestamp, niveau, service, message, identifiants (
userId,requestId— identifiant unique propagé de requête en requête, via le headerX-Request-Id, pour suivre un appel du proxy à la base). - Niveaux avec contrat :
error= regarder maintenant,warn= demain,info= contexte après-coup,debug= jamais en prod. - Rotation : limiter la taille/ancienneté des logs.
logrotate(outil système historique) ou options Docker (max-size: 10m, max-file: 3). Sans rotation, les logs remplissent le disque — la supervision cause la panne, comble. - NTP (Network Time Protocol) : synchronisation des horloges (actif par défaut sur Debian, vérifier avec
timedatectl). Sans ça, corréler proxy + app + base est un puzzle.
Exemple : lire, garder, corréler
journalctl -u mon-app -f # temps réel
journalctl -u mon-app --since "2 hours ago" -p err
docker compose logs -f --tail=200 api
journalctl --vacuum-size=1G # purge d'urgence du journal
Côté base, les requêtes lentes : log_min_duration_statement = 500ms (paramètre Postgres qui loggue toute requête plus lente — à activer en prod, c'est là que se cachent les lenteurs).
Cas réel
Incident « l'app est lente depuis ce matin » : corrélation des trois sources à la même heure → le proxy montre des temps de réponse qui grimpent à 9h12, log_min_duration_statement montre une requête passée de 80 ms à 4 s après le deploy de 9h. Cause : index oublié dans la migration. Sans logs corrélés : une journée de devinettes.
Pièges
- Jamais de mot de passe, token ni donnée personnelle : le log part en backup, en CI, parfois chez un tiers — tout ce qui y entre est compromis d'avance.
- Logger en
debugen prod « temporairement » : le temporaire dure, le disque se remplit. - Horloges désynchronisées de 2 minutes : on cherche au mauvais endroit pendant une heure.
À retenir
Structuré + requestId, niveaux avec contrat, zéro secret, rotation, horloges synchronisées.