Logging in Go-Anwendungen: Best Practices und Tools

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

Logging ist nicht einfach das Aufzeichnen von Ereignissen in einer Datei. Für Go-Anwendungen, die in stark ausgelasteten Produktionsumgebungen laufen, sind Logs die primäre Quelle für Diagnoseinformationen. Ohne qualitativ hochwertiges Logging wird die Fehlersuche zum Ratespiel und die Systemüberwachung unmöglich.

Go bietet dem Entwickler flexible Werkzeuge: vom integrierten Paket log bis hin zu leistungsstarken Drittanbieter-Bibliotheken. In diesem Artikel werden wir die besten Praktiken für das Logging in Go analysieren, lernen, Einträge zu strukturieren, Ebenen auszuwählen und typische Fehler zu vermeiden. Das Material wird sowohl für Anfänger als auch für erfahrene Entwickler nützlich sein, die ihren Ansatz zum Logging ordnen möchten.



Die Standardbibliothek log: Grundlegende Funktionen und Einschränkungen

Das Paket log aus der Go-Standardbibliothek ist der einfachste Weg, mit dem Logging zu beginnen. Es bietet einen vorgefertigten Logger, der in os.Stderr schreibt.



Einfaches Anwendungsbeispiel

package main

import ( "log")

func main() { log.Println("Anwendung gestartet") log.Printf("Benutzer %s hat sich angemeldet", "admin") log.Fatal("Kritischer Fehler: Datenbank nicht erreichbar")}

Die Ausgabe sieht wie folgt aus:

2023/10/27 14:35:12 Anwendung gestartet2023/10/27 14:35:12 Benutzer admin hat sich angemeldet2023/10/27 14:35:12 Kritischer Fehler: Datenbank nicht erreichbar


Einschränkungen des Standard-Loggers

  • Fehlende Log-Level — es gibt keine Unterteilung in Info, Warn, Error. Alle Nachrichten werden in einen einzigen Stream geschrieben.
  • Schlechte Struktur — ein Eintrag ist ein einfacher String, der schwer automatisch zu parsen ist.
  • Fehlender Kontext — es kann nicht einfach eine Anfrage-ID oder ein Benutzer hinzugefügt werden.
  • Leistungsprobleme — der Standard-Logger blockiert die Goroutine beim Schreiben, was zu einem Engpass werden kann.

Für kleine Dienstprogramme oder Prototypen ist log völlig ausreichend. Aber für Produktionsanwendungen sollte man Alternativen in Betracht ziehen.



Strukturiertes Logging: Warum ist es wichtig?

Strukturiertes Logging ist ein Ansatz, bei dem jede Nachricht eine Reihe von "Schlüssel-Wert"-Paaren (normalerweise im JSON-Format) darstellt. Dies ermöglicht:

  • Automatisches Parsen von Logs in Sammelsystemen (ELK, Splunk, Grafana Loki).
  • Filtern von Einträgen nach beliebigen Attributen (Level, Dienst, Anfrage-ID).
  • Erstellen von Dashboards und Alarmen basierend auf numerischen Feldern.


Beliebte Bibliotheken für strukturiertes Logging

  • logrus — eine der ersten und beliebtesten Bibliotheken. Bietet Level, Formatierung (JSON, Text), Hooks zum Senden von Logs an externe Systeme. Hat jedoch einen hohen Speicherverbrauch.
  • zerolog — eine Bibliothek mit Fokus auf Leistung (zero allocation). Ideal für Microservices und stark ausgelastete Systeme.
  • zap — von Uber. Sehr schnell, mit zwei Modi: SugaredLogger (bequem) und Logger (maximale Geschwindigkeit).
  • slog — ein Standardpaket, das in Go 1.21 hinzugefügt wurde. Bietet strukturiertes Logging "out of the box".


Beispiel mit slog (Go 1.21+)

package main

import ( "log/slog" "os")

func main() { logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) logger.Info("Server gestartet", "port", 8080, "env", "production") logger.Error("Fehler bei der DB-Verbindung", "db", "postgres", "timeout", 5)}

Ausgabe als JSON:

{"time":"2023-10-27T14:40:00.123Z","level":"INFO","msg":"Server gestartet","port":8080,"env":"production"}{"time":"2023-10-27T14:40:01.456Z","level":"ERROR","msg":"Fehler bei der DB-Verbindung","db":"postgres","t                

Blogs

Buchempfehlungen