Devmind.
Menu

Apprendre, à votre rythme

Tous les cursus sont accessibles sans compte.

Chapitre 7 / Notion

Des logs qui servent à quelque chose

En incident, les logs sont ton seul témoin.

◷ 16 minutesTravail sur votre machine

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 header X-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 debug en 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.

Pas de correction en ligneConfrontez votre code aux résultats attendus du cours.