Logging in Go-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

Logging in Go-Anwendungen: Best Practices für Anfänger

\n\n

Logging ist eine der Schlüsselkomponenten jeder ernsthaften Anwendung. Es hilft, Fehler zu verfolgen, das Systemverhalten zu analysieren und zu verstehen, was "unter der Haube" passiert. In diesem Artikel werden wir die besten Praktiken für das Logging in Go (Golang) für Anfänger-Entwickler durchgehen. Sie erfahren, welche Bibliotheken Sie verwenden, wie Sie Logs organisieren und typische Fehler vermeiden.

\n\n

Warum ist Logging in Go wichtig?

\n\n

Go ist eine Sprache, die auf die Erstellung hochbelastbarer Serveranwendungen und Microservices ausgerichtet ist. In solchen Systemen ist ohne qualitativ hochwertiges Logging Folgendes unmöglich:

\n\n
    \n
  • Schnelles Auffinden der Fehlerursache
  • \n
  • Verstehen der Ereignisabfolge
  • \n
  • Sammeln von Metriken für das Monitoring
  • \n
  • Debuggen von Code in der Produktionsumgebung
  • \n
\n\n

Schlecht konfiguriertes Logging kann zum Verlust kritischer Daten oder im Gegenteil zur Überflutung der Festplatte mit Millionen nutzloser Nachrichten führen. Daher ist es wichtig, von Anfang an die richtige Architektur zu schaffen.

\n\n

Die Standardbibliothek log

\n\n

Go bietet ein integriertes Paket log, das für einfache Projekte geeignet ist. Es kann Nachrichten in stdout/stderr ausgeben, Zeitstempel hinzufügen und das Programm bei schwerwiegenden Fehlern beenden.

\n\n
package main\n\nimport (\n    "log"\n)\n\nfunc main() {\n    log.Println("Anwendung gestartet")\n    log.Printf("Benutzer %s hat sich angemeldet", "admin")\n    // log.Fatal("Kritischer Fehler") // beendet das Programm\n}
\n\n

Nachteile des Standard-Loggers:

\n
    \n
  • Keine Log-Level (debug, info, warn, error)
  • \n
  • Keine strukturierte Ausgabe (nur Text)
  • \n
  • Schwierig, Format und Ausgaberichtung zu ändern
  • \n
\n\n

Für Lernprojekte und einfache Dienstprogramme reicht dies aus, aber für Produktionsanwendungen ist es besser, leistungsfähigere Bibliotheken zu verwenden.

\n\n

Beliebte Bibliotheken für das Logging

\n\n

Betrachten wir drei der am weitesten verbreiteten Optionen.

\n\n

1. Logrus

\n\n

Logrus ist eine der ersten Drittanbieter-Bibliotheken für Go. Sie unterstützt Log-Level, strukturierte Felder und viele Ausgabeformate (JSON, Text).

\n\n
package main\n\nimport (\n    "github.com/sirupsen/logrus"\n)\n\nfunc main() {\n    log := logrus.New()\n    log.SetFormatter(&logrus.JSONFormatter{})\n    log.SetLevel(logrus.InfoLevel)\n\n    log.WithFields(logrus.Fields{\n        "user":   "ivan",\n        "action": "login",\n    }).Info("Benutzer hat sich angemeldet")\n}
\n\n

Logrus ist einfach zu bedienen, hat aber einen hohen Speicherverbrauch und ist etwas langsamer als moderne Alternativen.

\n\n

2. Zerolog

\n\n

Zerolog ist eine moderne Bibliothek mit Fokus auf Leistung und minimale Speicherzuweisung. Sie verwendet einen Zero-Allocation-Ansatz und ist ideal für hochbelastbare Systeme.

\n\n
package main\n\nimport (\n    "github.com/rs/zerolog"\n    "github.com/rs/zerolog/log"\n)\n\nfunc main() {\n    zerolog.TimeFieldFormat = zerolog.TimeFormatUnix\n\n    log.Info().\n        Str("user", "ivan").\n        Str("action", "login").\n        Msg("Benutzer hat sich angemeldet")\n\n    log.Error().\n        Err(fmt.Errorf("connection refused")).\n        Msg("Fehler bei der Datenbankverbindung")\n}
\n\n

Zerolog gibt Logs standardmäßig im JSON-Format aus, was deren Parsing durch Überwachungssysteme (ELK, Grafana Loki) vereinfacht.

\n\n

3. Zap

\n\n

Zap von Uber ist ein weiterer hochleistungsfähiger Logger. Er arbeitet in zwei Modi: SugaredLogger (bequem, aber etwas langsamer) und Logger (maximale Geschwindigkeit).

\n\n
package main\n\nimport (\n    "go.uber.org/zap"\n)\n\nfunc main() {\n    logger, _ := zap.NewProduction()\n    defer logger.Sync()\n\n    logger.Info("Server gestartet",\n        zap.String("port", "8080"),\n        zap.Int("workers", 10),\n    )\n}
\n\n

Für n

Blogs

Buchempfehlungen