Logging & Monitoring
Regeln
- Strukturiertes Logging: JSON-Format mit Feldern
timestamp, level, message, requestId, userId
- Log-Level:
error (kaputt), warn (beeinträchtigt), info (Geschäftsereignisse), debug (nur Entwicklung)
- Verwende Pino für Node.js-Logging – schnell, strukturiert, JSON standardmäßig
- Sentry für Fehlerverfolgung: früh initialisieren, unbehandelte Ausnahmen abfangen, Benutzerkontext und Breadcrumbs hinzufügen
- Korreliere Logs mit Request-IDs – generiere eine UUID pro Request, reiche sie durch alle Service-Aufrufe
- Protokolliere niemals Geheimnisse, Passwörter, Tokens oder vollständige Kreditkartennummern – schwärze sensible Felder
- Alarmiere bei Spitzen der Fehlerrate, nicht bei einzelnen Fehlern – verwende Schwellenwerte (z. B. >5% Fehlerrate in 5 Minuten)
- Axiom/Datadog: Logs per OTLP oder nativem SDK senden, benutzerdefinierte Metriken für Geschäfts-KPIs hinzufügen
- Health-Check-Endpunkt:
GET /health mit Rückgabe { status: "ok" } inklusive DB-Konnektivitätsprüfung
- Überwache Antwortzeiten bei p50, p95, p99 – alarmiere bei Verschlechterung des p95-Perzentils
Muster
import pino from "pino";
const logger = pino({ level: process.env.LOG_LEVEL || "info" });
logger.info({ userId, action: "checkout", orderId }, "Bestellung aufgegeben");
logger.error({ err, requestId }, "Zahlungsverarbeitung fehlgeschlagen");
import * as Sentry from "@sentry/nextjs";
Sentry.init({ dsn: process.env.SENTRY_DSN, tracesSampleRate: 0.1 });
Vermeide
console.log in der Produktion – verwende einen strukturierten Logger
- Das Protokollieren jedes Request-Bodys – protokolliere Zusammenfassungen, nicht die Nutzdaten
- Das Ignorieren unbehandelter Promise-Ablehnungen – fange sie immer ab
- Alarmmüdigkeit durch laute Alarme – justiere Schwellenwerte, gruppiere ähnliche Fehler