Middleware de registro e identificador de solicitud
Registro estructurado e inyección del identificador de trazas
Middleware de registro e identificador de solicitud es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.
¿Por qué usar registros estructurados?
Los registros de texto sin formato son difíciles de analizar a gran escala. Los registros estructurados (JSON o clave=valor) permiten que los agregadores de registros (Datadog, Loki, ELK) filtren y correlacionen las entradas por campo.
Generación del ID de solicitud
Genere un ID único para cada solicitud (UUID o ULID) en el middleware y asígnelo al encabezado de respuesta y al 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))
})
}Middleware de registro con slog
Go 1.21 añadió log/slog para los registros estructurados. Úselo dentro 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
Envuelva el ResponseWriter para capturar el código de estado escrito por el controlador:
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
}Añadir el ID de solicitud a cada línea del registro
Cree un registrador secundario para cada solicitud con el ID ya incluido y, después, almacénelo en el contexto:
reqLogger := logger.With("request_id", id)
ctx := context.WithValue(r.Context(), loggerKey{}, reqLogger)Recuperación del registrador desde el contexto
Asistente para obtener el registrador asociado a la solicitud desde cualquier controlador o servicio:
func LoggerFromContext(ctx context.Context) *slog.Logger {
l, ok := ctx.Value(loggerKey{}).(*slog.Logger)
if !ok { return slog.Default() }
return l
}Niveles de registro
Use los niveles adecuados: Debug para el nivel de detalle del desarrollo, Info para los resúmenes de solicitudes, Warn para anomalías recuperables y Error para fallos que requieren intervención. No registre campos sensibles (tokens, contraseñas).
Intervalos de latencia
Incluya la latencia de la solicitud en cada línea del registro. Agréguela en intervalos de histograma en su sistema de métricas (Prometheus) para realizar un seguimiento de los percentiles P50, P95 y P99.
Identificadores de correlación en microservicios
Reenvíe el encabezado X-Request-ID de las solicitudes entrantes a todas las llamadas HTTP y gRPC salientes para habilitar el rastreo distribuido sin necesidad de un sistema de rastreo completo.
Muestreo de logs
En servicios con mucho tráfico, muestree los logs de depuración e información (por ejemplo, registre 1 de cada 100 solicitudes en el nivel debug) para reducir los costes de almacenamiento y mantener completos los logs de errores.
zap frente a slog
zap (Uber) es más rápido que slog para servicios de alto rendimiento, pero requiere más configuración. slog forma parte de la biblioteca estándar, es portable y suficiente para la mayoría de los servicios. Prefiera slog a menos que los benchmarks indiquen un cuello de botella.
Comprobación rápida
¿Por qué se necesita un captureWriter en el middleware de logging?
Resumen: logging e identificadores de solicitud
Puntos clave:
- Genere o reenvíe X-Request-ID en el middleware y almacénelo en context
- Utilice slog para logs estructurados con campos clave-valor
- captureWriter intercepta el código de estado para registrar el log después del handler
- Reenvíe el identificador de correlación a todas las llamadas posteriores
Aprende Go con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 51
- Lecciones
- 203
Preguntas frecuentes
¿La lección «Middleware de registro e identificador de solicitud» es gratis?
Sí — el texto completo de «Middleware de registro e identificador de solicitud» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Middleware de registro e identificador de solicitud»?
Registro estructurado e inyección del identificador de trazas Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Go Academy?
No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Middleware de registro e identificador de solicitud»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Go Academy?
Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Fundamentos de la cadena de middleware HTTP
- Middleware de registro e identificador de solicitud
- Middleware de autenticación y limitación de tasa
- Middleware de CORS y recuperación ante panics