0Pricing
Go Academy · Lezione

Middleware per logging e ID della richiesta

Logging strutturato e inserimento dell'ID di tracciamento

Middleware per logging e ID della richiesta è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.

Perché utilizzare il logging strutturato?

I log in testo semplice sono difficili da analizzare su larga scala. Il logging strutturato (JSON o key=value) consente agli aggregatori di log (Datadog, Loki, ELK) di filtrare e correlare le voci in base ai campi.

Generazione dell'ID della richiesta

Generi un ID univoco per ogni richiesta (UUID o ULID) nel middleware e lo colleghi all'header della risposta e al contesto:

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

Middleware di logging con slog

Go 1.21 ha aggiunto log/slog per il logging strutturato. Lo utilizzi all'interno del 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

Avvolga il ResponseWriter per acquisire il codice di stato scritto dal gestore:

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
}

Aggiunta dell'ID della richiesta a ogni riga di log

Crei un logger figlio per ogni richiesta con l'ID già valorizzato, quindi lo memorizzi nel contesto:

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

Recupero del logger dal contesto

Helper per ottenere il logger associato alla richiesta da qualsiasi gestore o servizio:

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

Livelli di log

Utilizzi livelli appropriati: Debug per la verbosità in fase di sviluppo, Info per i riepiloghi delle richieste, Warn per le anomalie recuperabili, Error per i problemi che richiedono un intervento. Non registri campi sensibili (token, password).

Bucket della latenza

Includa la latenza della richiesta in ogni riga di log. La aggreghi in bucket di istogrammi nel sistema di metriche (Prometheus) per monitorare i percentili P50/P95/P99.

ID di correlazione nei microservizi

Inoltri l'header X-Request-ID delle richieste in ingresso a tutte le chiamate HTTP e gRPC in uscita, per abilitare il tracing distribuito senza un sistema di tracing completo.

Campionamento dei log

Per i servizi ad alto traffico, campioni i log di debug/info (ad esempio, registri 1 richiesta su 100 a livello debug) per ridurre i costi di archiviazione mantenendo completi i log degli errori.

zap vs slog

zap (Uber) è più veloce di slog per i servizi ad alto throughput, ma richiede una maggiore configurazione. slog fa parte della libreria standard, è portabile ed è sufficiente per la maggior parte dei servizi. Preferisca slog, a meno che i benchmark non mostrino un collo di bottiglia.

Verifica rapida

Perché è necessario un captureWriter nel middleware di logging?

Riepilogo: logging e ID delle richieste

Punti chiave:

  • Generare o inoltrare X-Request-ID nel middleware e memorizzarlo nel context
  • Utilizzare slog per i log strutturati con campi chiave-valore
  • captureWriter intercetta il codice di stato per il logging dopo l'esecuzione dell'handler
  • Inoltrare l'ID di correlazione a tutte le chiamate downstream

Domande Frequenti

La lezione «Middleware per logging e ID della richiesta» è gratuita?

Sì — il testo completo di «Middleware per logging e ID della richiesta» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.

Cosa imparerò in «Middleware per logging e ID della richiesta»?

Logging strutturato e inserimento dell'ID di tracciamento Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Go Academy?

Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Middleware per logging e ID della richiesta»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Go Academy?

Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Fondamenti della catena middleware HTTP
  2. Middleware per logging e ID della richiesta
  3. Middleware per autenticazione e limitazione della frequenza
  4. Middleware CORS e recupero dai panic
← Torna a Go Academy