Journalisation et Surveillance
Règles
- Journalisation structurée : format JSON avec les champs
timestamp, level, message, requestId, userId
- Niveaux de logs :
error (panne), warn (dégradé), info (événements métier), debug (développement uniquement)
- Utiliser Pino pour la journalisation Node.js — rapide, structuré, JSON par défaut
- Sentry pour le suivi des erreurs : initialiser tôt, capturer les exceptions non gérées, ajouter le contexte utilisateur et des breadcrumbs
- Corréler les logs avec les identifiants de requête — générer un UUID par requête, le transmettre à travers tous les appels de service
- Ne jamais journaliser de secrets, mots de passe, jetons ou numéros de carte de crédit complets — masquer les champs sensibles
- Alerter sur les pics de taux d'erreur, pas sur les erreurs individuelles — utiliser des seuils (ex. >5% de taux d'erreur en 5 min)
- Axiom/Datadog : envoyer les logs via OTLP ou SDK natif, ajouter des métriques personnalisées pour les KPI métier
- Endpoint de santé :
GET /health retournant { status: "ok" } avec une vérification de connectivité à la base de données
- Surveiller les temps de réponse aux percentiles p50, p95, p99 — alerter en cas de dégradation du p95
Modèles
import pino from "pino";
const logger = pino({ level: process.env.LOG_LEVEL || "info" });
logger.info({ userId, action: "checkout", orderId }, "Commande passée");
logger.error({ err, requestId }, "Échec du traitement du paiement");
import * as Sentry from "@sentry/nextjs";
Sentry.init({ dsn: process.env.SENTRY_DSN, tracesSampleRate: 0.1 });
Éviter
console.log en production — utiliser un journaliseur structuré
- Journaliser chaque corps de requête — journaliser des résumés, pas les charges utiles
- Ignorer les rejets de promesses non gérés — toujours les capturer
- Fatigue des alertes due à des alertes trop nombreuses — ajuster les seuils, regrouper les erreurs similaires