Logging in TypeScript-Anwendungen: Best Practices

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

Einleitung: Warum ist Logging in TypeScript wichtig?

Logging ist nicht nur das Aufzeichnen von Nachrichten in der Konsole. In modernen TypeScript-Anwendungen (serverseitig mit Node.js, clientseitig mit React/Angular oder Full-Stack-Projekten) wird Logging zu einem kritischen Werkzeug für Debugging, Monitoring und Leistungsanalyse. Ohne qualitativ hochwertiges Logging verbringen Entwickler Stunden mit der Reproduktion von Fehlern, und DevOps-Ingenieure können die Ursache eines Ausfalls in der Produktion nicht schnell identifizieren.

TypeScript, als Erweiterung von JavaScript, fügt eine strenge Typisierung hinzu, was die Erstellung zuverlässigerer und vorhersagbarer Logging-Systeme ermöglicht. In diesem Artikel werden wir die besten Praktiken durchgehen, die Ihnen helfen, effektives Logging in TypeScript-Projekten zu organisieren.



Grundprinzipien des Logging

Logging-Level

Die korrekte Verwendung von Logging-Leveln ist die Grundlage jedes Monitoringsystems. In TypeScript werden üblicherweise die folgenden Level verwendet (aufsteigend nach Wichtigkeit):

  • debug — detaillierte Debug-Informationen (nur für die Entwicklung);
  • info — standardmäßige Informationsmeldungen (Serverstart, Anfragen);
  • warn — Warnungen (nicht kritische Probleme);
  • error — Fehler, die Aufmerksamkeit erfordern;
  • fatal — kritische Fehler, die zum Stoppen der Anwendung führen.

Beispiel für die Konfiguration von Leveln mit der Bibliothek Winston:

import winston from 'winston';

const logger = winston.createLogger({ level: process.env.NODE_ENV === 'production' ? 'info' : 'debug', format: winston.format.json(), transports: [ new winston.transports.Console(), new winston.transports.File({ filename: 'error.log', level: 'error' }), ],});

logger.info('Server gestartet auf Port 3000');logger.warn('Speicher nahe am Limit');logger.error('Fehler bei der Datenbankverbindung');


Strukturierte Logs

Vermeiden Sie einfache String-Nachrichten. Verwenden Sie strukturierte Logs mit Kontextinformationen (JSON-Format). Dies vereinfacht die Suche und Analyse in Systemen wie ELK oder Grafana.

// Schlechtlogger.info(`Benutzer ${userId} hat Aktion ${action} ausgeführt`);

// Gutlogger.info('Benutzeraktion', { userId: userId, action: action, timestamp: new Date().toISOString(), ip: request.ip,});

Dieser Ansatz ermöglicht das Filtern von Logs nach Feldern und das Erstellen von Diagrammen.



Beste Praktiken für TypeScript

Verwendung von TypeScript zur Typisierung von Logs

TypeScript ermöglicht die Definition von Interfaces für den Log-Kontext, was versehentliche Fehler in Feldnamen verhindert:

interface LogContext {  userId: string;  action: string;  durationMs: number;  success: boolean;}

function logUserAction(context: LogContext): void { logger.info('User action', context);}

// Der Compiler prüft, ob alle Felder korrekt übergeben wurdenlogUserAction({ userId: '123', action: 'login', durationMs: 150, success: true,});


Vermeiden Sie das Logging sensibler Daten

Loggen Sie niemals Passwörter, Tokens, Kreditkartennummern oder personenbezogene Daten (GDPR). Verwenden Sie Hilfsfunktionen zur Maskierung:

function sanitizeLogData(data: Record<string, unknown>): Record<string, unknown> {  const sensitiveFields = ['password', 'token', 'ssn'];  const sanitized = { ...data };  for (const field of sensitiveFields) {    if (sanitized[field]) {      sanitized[field] = '***';    }  }  return sanitized;}

logger.info('Benutzerregistrierung', sanitizeLogData(userData));


Asynchrones Logging und Leistung

In hochbelasteten Anwendungen kann synchrones Logging die Arbeit verlangsamen. Verwenden Sie asynchrone Transports (z.B. unterstützt winston Pufferung).

Blogs

Buchempfehlungen