Middleware de logging e ID de requisição
Use logging estruturado e injete o ID de rastreamento
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
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
- Fundamentos da cadeia de middleware HTTP
- Middleware de logging e ID de requisição
- Middleware de autenticação e limitação de taxa
- Middleware de CORS e recuperação de panic