0Pricing
Go Academy · Lektion

Logging- und Request-ID-Middleware

Strukturiertes Logging und Trace-ID-Injektion

Logging- und Request-ID-Middleware ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum strukturiertes Logging?

Reine Text-Logs lassen sich in großem Maßstab nur schwer analysieren. Strukturiertes Logging (JSON oder Schlüssel=Wert) ermöglicht es Log-Aggregatoren (Datadog, Loki, ELK), Einträge nach Feldern zu filtern und zu korrelieren.

Request-ID generieren

Generieren Sie in der Middleware für jede Anfrage eine eindeutige ID (UUID oder ULID) und fügen Sie sie dem Antwort-Header und dem Kontext hinzu:

func RequestID(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        id := r.Header.Get("X-Request-ID")
        if id == "" { id = uuid.New().String() }
        w.Header().Set("X-Request-ID", id)
        ctx := context.WithValue(r.Context(), reqIDKey{}, id)
        next.ServeHTTP(w, r.WithContext(ctx))
    })
}

Logging-Middleware mit slog

Go 1.21 hat log/slog für strukturiertes Logging eingeführt. Verwenden Sie es innerhalb der Middleware:

func StructuredLogger(logger *slog.Logger) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            start := time.Now()
            cw := &captureWriter{ResponseWriter: w}
            next.ServeHTTP(cw, r)
            logger.Info("request",
                "method", r.Method,
                "path", r.URL.Path,
                "status", cw.status,
                "latency_ms", time.Since(start).Milliseconds(),
                "request_id", r.Context().Value(reqIDKey{}),
            )
        })
    }
}

captureWriter

Umschließen Sie den ResponseWriter, um den vom Handler geschriebenen Statuscode zu erfassen:

type captureWriter struct {
    http.ResponseWriter
    status int
}
func (cw *captureWriter) WriteHeader(code int) {
    cw.status = code
    cw.ResponseWriter.WriteHeader(code)
}
func (cw *captureWriter) Status() int {
    if cw.status == 0 { return http.StatusOK }
    return cw.status
}

Request-ID zu jeder Logzeile hinzufügen

Erstellen Sie pro Anfrage einen untergeordneten Logger, in dem die ID bereits enthalten ist, und speichern Sie ihn anschließend im Kontext:

reqLogger := logger.With("request_id", id)
ctx := context.WithValue(r.Context(), loggerKey{}, reqLogger)

Logger aus dem Kontext abrufen

Hilfsfunktion, um den anfragebezogenen Logger aus jedem Handler oder Dienst abzurufen:

func LoggerFromContext(ctx context.Context) *slog.Logger {
    l, ok := ctx.Value(loggerKey{}).(*slog.Logger)
    if !ok { return slog.Default() }
    return l
}

Log-Level

Verwenden Sie passende Stufen: Debug für ausführliche Ausgaben während der Entwicklung, Info für Zusammenfassungen von Anfragen, Warn für behebbare Auffälligkeiten und Error für unmittelbar zu bearbeitende Fehler. Protokollieren Sie keine vertraulichen Felder (Token, Passwörter).

Latenz-Buckets

Nehmen Sie die Latenz jeder Anfrage in jede Logzeile auf. Aggregieren Sie sie in Ihrem Metrics-System (Prometheus) in Histogramm-Buckets, um die Perzentile P50/P95/P99 zu verfolgen.

Korrelations-IDs in Microservices

Leiten Sie den X-Request-ID-Header eingehender Anfragen an alle ausgehenden HTTP- und gRPC-Aufrufe weiter, um verteiltes Tracing ohne ein vollständiges Tracing-System zu ermöglichen.

Log-Sampling

Bei stark frequentierten Diensten können Sie Debug-/Info-Logs stichprobenartig erfassen (z. B. nur 1 von 100 Anfragen auf Debug-Level protokollieren), um Speicherkosten zu senken und gleichzeitig Fehler-Logs vollständig zu behalten.

zap vs slog

zap (Uber) ist für Dienste mit hohem Durchsatz schneller als slog, erfordert aber mehr Einrichtung. slog gehört zur Standardbibliothek, ist portabel und für die meisten Dienste ausreichend. Bevorzugen Sie slog, sofern Benchmarks keinen Engpass zeigen.

Kurzer Check

Warum wird in Logging-Middleware ein captureWriter benötigt?

Zusammenfassung: Logging und Request-ID

Wichtige Punkte:

  • X-Request-ID in der Middleware erzeugen oder weiterleiten und im Context speichern
  • slog für strukturierte Logs mit Schlüssel-Wert-Feldern verwenden
  • captureWriter fängt den Statuscode für das Logging nach dem Handler ab
  • Die Korrelations-ID an alle nachgelagerten Aufrufe weiterleiten

Häufig gestellte Fragen

Ist die Lektion „Logging- und Request-ID-Middleware“ kostenlos?

Ja — der vollständige Text von „Logging- und Request-ID-Middleware“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Logging- und Request-ID-Middleware“?

Strukturiertes Logging und Trace-ID-Injektion Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Go Academy zu starten?

Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Logging- und Request-ID-Middleware“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?

Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Grundlagen der HTTP-Middleware-Kette
  2. Logging- und Request-ID-Middleware
  3. Middleware für Authentifizierung und Rate Limiting
  4. CORS- und Panic-Recovery-Middleware
← Zurück zu Go Academy