Go Academy · Lektion

Middleware för loggning och förfrågnings-ID

Strukturerad loggning och injicering av spårnings-ID

Lektion 2 av 413 steg

Middleware för loggning och förfrågnings-ID är en gratis lektion i Go Academy på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Go Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Go Academy innehåller totalt 4 lektioner.

Varför strukturerad loggning?

Vanliga textloggar är svåra att analysera i stor skala. Strukturerad loggning (JSON eller key=value) gör att loggaggregatorer (Datadog, Loki, ELK) kan filtrera och korrelera poster efter fält.

Generering av request-ID

Generera ett unikt ID per request (UUID eller ULID) i middleware och koppla det till svarshuvudet och context:

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))
    })
}

Loggningsmiddleware med slog

Go 1.21 lade till log/slog för strukturerad loggning. Använd det i 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

Slå in ResponseWriter för att fånga statuskoden som handlern skriver:

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
}

Lägg till request-ID på varje loggrad

Skapa en underordnad logger per request med ID:t förifyllt och lagra den i context:

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

Hämta loggern från context

Hjälpare för att hämta den request-scopeade loggern från valfri handler eller tjänst:

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

Loggningsnivåer

Använd lämpliga nivåer: Debug för utförliga utvecklingsloggar, Info för requestsammanfattningar, Warn för avvikelser som kan hanteras och Error för åtgärdskrävande fel. Logga inte känsliga fält (token, lösenord).

Latensintervall

Inkludera request-latens i varje loggrad. Sammanställ den i histogramintervall i ditt metriksystem (Prometheus) för att följa P50-, P95- och P99-percentiler.

Korrelations-ID:n i mikrotjänster

Vidarebefordra X-Request-ID-headern från inkommande begäranden till alla utgående HTTP- och gRPC-anrop för att möjliggöra distribuerad spårning utan ett komplett spårningssystem.

Loggsampling

För tjänster med hög trafik kan ni sampla debug-/info-loggar (t.ex. logga 1 av 100 begäranden på debug-nivå) för att minska lagringskostnaderna samtidigt som felloggarna bevaras fullständigt.

zap jämfört med slog

zap (Uber) är snabbare än slog för tjänster med hög genomströmning, men kräver mer konfiguration. slog ingår i standardbiblioteket, är portabelt och tillräckligt för de flesta tjänster. Föredra slog om inte benchmarkresultat visar en flaskhals.

Snabbkontroll

Varför behövs en captureWriter i logging-middleware?

Sammanfattning: loggning och Request ID

Viktiga punkter:

  • Skapa/vidarebefordra X-Request-ID i middleware och lagra det i context
  • Använd slog för strukturerade loggar med nyckel-värde-fält
  • captureWriter fångar upp statuskoden för loggning efter hanteraren
  • Vidarebefordra korrelations-ID:t till alla efterföljande anrop
Gratis att börja

Lär dig Go med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
51
Lektioner
203

Vanliga frågor

Är lektionen ”Middleware för loggning och förfrågnings-ID” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Go Academy, inklusive ”Middleware för loggning och förfrågnings-ID”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Go Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Middleware för loggning och förfrågnings-ID”?

Strukturerad loggning och injicering av spårnings-ID Ni övar på Go Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Go Academy?

Du behöver inga förkunskaper. Utbildningen i Go Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Middleware för loggning och förfrågnings-ID”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Go Academy-lektionen?

Ja. Varje Go Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Grunderna i HTTP-middlewarekedjor
  2. Middleware för loggning och förfrågnings-ID
  3. Middleware för autentisering och hastighetsbegränsning
  4. Middleware för CORS och panic-återställning
← Tillbaka till Go Academy