Go Academy · Aula

Middleware de logging e ID de requisição

Use logging estruturado e injete o ID de rastreamento

Aula 2 de 413 etapas

Middleware de logging e ID de requisição é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.

Por que utilizar registros estruturados?

Registros em texto simples são difíceis de analisar em grande escala. O registro estruturado (JSON ou chave=valor) permite que agregadores de registros (Datadog, Loki, ELK) filtrem e correlacionem entradas por campo.

Geração do ID da requisição

Gere um ID exclusivo para cada requisição (UUID ou ULID) na camada intermediária e anexe-o ao cabeçalho de resposta e ao contexto:

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

Camada intermediária de registro com slog

O Go 1.21 adicionou log/slog para registros estruturados. Utilize-o dentro da camada intermediária:

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

Envolva o ResponseWriter para capturar o código de status gravado pelo manipulador:

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
}

Adição do ID da requisição a cada linha de registro

Crie um registrador filho para cada requisição, com o ID previamente preenchido, e armazene-o no contexto:

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

Recuperação do registrador a partir do contexto

Auxiliar para obter o registrador específico da requisição a partir de qualquer manipulador ou serviço:

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

Níveis de registro

Utilize níveis apropriados: Debug para detalhamento durante o desenvolvimento, Info para resumos de requisições, Warn para anomalias recuperáveis e Error para falhas que exigem ação. Não registre campos confidenciais, como tokens e senhas.

Faixas de latência

Inclua a latência da requisição em cada linha de registro. Agregue-a em faixas de histograma no seu sistema de métricas (Prometheus) para acompanhar os percentis P50/P95/P99.

IDs de correlação em microsserviços

Encaminhe o cabeçalho X-Request-ID das solicitações recebidas para todas as chamadas HTTP e gRPC de saída, a fim de habilitar o rastreamento distribuído sem um sistema completo de rastreamento.

Amostragem de registros

Para serviços com tráfego intenso, faça uma amostragem dos registros de depuração e informação (por exemplo, registre 1 em cada 100 solicitações no nível de depuração) para reduzir os custos de armazenamento e manter completos os registros de erros.

zap vs slog

zap (Uber) é mais rápido que slog para serviços de alto volume, mas exige mais configuração. slog faz parte da biblioteca padrão, é portátil e suficiente para a maioria dos serviços. Prefira slog, a menos que os testes de desempenho indiquem um gargalo.

Verificação rápida

Por que um captureWriter é necessário no middleware de registro?

Recapitulação: registro e ID da solicitação

Pontos principais:

  • Gere ou encaminhe X-Request-ID no middleware e armazene-o no contexto
  • Use slog para registros estruturados com campos de chave e valor
  • captureWriter intercepta o código de status para o registro posterior ao manipulador
  • Encaminhe o ID de correlação para todas as chamadas posteriores
Grátis para começar

Aprenda Go com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
51
Aulas
203

Perguntas Frequentes

A aula “Middleware de logging e ID de requisição” é grátis?

Sim — o texto completo de “Middleware de logging e ID de requisição” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.

O que vou aprender em “Middleware de logging e ID de requisição”?

Use logging estruturado e injete o ID de rastreamento Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Go Academy?

Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Middleware de logging e ID de requisição”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Go Academy?

Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Fundamentos da cadeia de middleware HTTP
  2. Middleware de logging e ID de requisição
  3. Middleware de autenticação e limitação de taxa
  4. Middleware de CORS e recuperação de panic
← Voltar para Go Academy