Protokollierung in JavaScript-Anwendungen: Best Practices für Anfänger

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Protokollierung in JavaScript-Anwendungen: Best Practices für Anfänger



Protokollierung ist die Grundlage für das Debugging und Monitoring jeder Anwendung. Ohne qualitativ hochwertige Logs werden Sie die „Nadel im Heuhaufen“ suchen, wenn etwas schiefgeht. In diesem Artikel analysieren wir die Best Practices für die Protokollierung in JavaScript (Node.js), die sowohl für kleine Projekte als auch für die Produktion geeignet sind.



1. Warum sollte man sich nicht auf console.log verlassen?



Viele Anfänger verwenden console.log für alles. Das ist in der Entwicklungsphase praktisch, führt aber in einer Produktionsumgebung zu Problemen:



  • Keine Protokollierungsebenen — Sie können Fehler nicht von Informationsmeldungen filtern.
  • Schwierige Ausgabeverwaltung — Sie können Logs für bestimmte Module nicht deaktivieren.
  • Schlechte Leistung — Die Serialisierung von Objekten in console.log kann aufwändig sein.
  • Fehlende Struktur — Logs haben kein einheitliches Format (JSON, Zeitstempel, Ebene).


Verwenden Sie stattdessen spezialisierte Bibliotheken. Hier ist ein einfaches, aber korrektes Beispiel mit Winston:



// logger.jsconst winston = require('winston');

const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' }), ],});

if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.simple(), }));}

module.exports = logger;


2. Protokollierungsebenen: Wann was verwenden



Standard-Protokollierungsebenen (nach steigendem Schweregrad): debug, info, warn, error. Es ist wichtig zu verstehen, wann welche Ebene anzuwenden ist:



  • debug — detaillierte Informationen für Entwickler (Variablenwerte, Systemzustand). Wird in der Produktion deaktiviert.
  • info — normale Ereignisse des Anwendungsbetriebs (Anfrage verarbeitet, Benutzer registriert).
  • warn — potenziell gefährliche Situationen (geringer Arbeitsspeicher, veraltete API).
  • error — Fehler, die ein Eingreifen erfordern (Ausnahmen, Datenbankausfälle).


Beispiel für die korrekte Verwendung mit der Bibliothek Pino (der schnellsten für Node.js):



const pino = require('pino');

const logger = pino({ level: process.env.LOG_LEVEL || 'info', transport: { target: 'pino-pretty', options: { colorize: true } }});

// Verwendunglogger.info({ userId: 123 }, 'Benutzer hat sich angemeldet');logger.error(new Error('Fehler bei der Datenbankverbindung'), 'Kritischer Fehler');logger.debug('Wert der Variable x = 42'); // wird nicht ausgegeben, wenn level = 'info'


3. Strukturierte Protokollierung: JSON und Kontext



Verwenden Sie anstelle von Textzeichenfolgen strukturierte Logs (normalerweise JSON). Dies ermöglicht:



  • Einfaches Parsen von Logs mit Tools (ELK, Graylog).
  • Hinzufügen von Kontext (Anfrage-ID, Benutzer, Version).
  • Filtern und Aggregieren von Daten.


Beispiel für einen strukturierten Log mit Kontext:



const logger = require('./logger');

app.use((req, res, next) => { req.requestId = uuidv4(); next();});

app.get('/api/users', async (req, res) => { logger.info({ requestId: req.requestId, method: req.method, url: req.originalUrl, ip: req.ip }, 'Eingehende Anfrage');

try { const users = await getUsers(); logger.info({ requestId: req.requestId, count: users.length }, 'Benutzer abgerufen'); res.json(users); } catch (err) { logger.error({

Blogs

Buchempfehlungen