Middleware för loggning och förfrågnings-ID
Strukturerad loggning och injicering av spårnings-ID
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
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
- Grunderna i HTTP-middlewarekedjor
- Middleware för loggning och förfrågnings-ID
- Middleware för autentisering och hastighetsbegränsning
- Middleware för CORS och panic-återställning