Files
fn_registry/functions/infra/logger_middleware.md
T
egutierrez e030b105b1 feat: logger_middleware — middleware HTTP con logs estructurados (infra)
Middleware que envuelve cualquier http.Handler y emite un log info por
cada request con method, path, status y duration_ms. Hereda los campos
contextuales del Logger (app, version, request_id...) y se compone con
HTTPMiddlewareChain + HTTPCORSMiddleware.

Diferencia con http_logger_middleware: este escribe JSON estructurado via
slog en vez de texto plano a un io.Writer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 17:14:36 +02:00

2.1 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports params output tested tests test_file_path file_path
logger_middleware function go infra 1.0.0 impure func LoggerMiddleware(logger *Logger) Middleware Retorna un Middleware HTTP que emite un log estructurado por cada request. Cada request produce una entrada info con method, path, status y duration_ms. Respeta los campos contextuales del Logger (app, version, request_id...).
logging
log
slog
middleware
http
server
infra
log_info_go_infra
Logger_go_infra
Middleware_go_infra
Middleware_go_infra
false error_go_core
net/http
time
name desc
logger Logger estructurado al que emitir cada request. Hereda los campos contextuales (app, version...)
Middleware que loguea cada request HTTP tras su procesamiento true
loguea method, path, status y duration_ms
usa status 200 si el handler no llama WriteHeader
preserva los campos contextuales del logger
functions/infra/logger_test.go functions/infra/logger_middleware.go

Ejemplo

base, _ := LoggerNew(LogLevelInfo, os.Stdout, "json")
appLog := LoggerWith(base, map[string]any{"app": "sqlite_api"})

mux := HTTPRouter(routes)
chain := HTTPMiddlewareChain(LoggerMiddleware(appLog), HTTPCORSMiddleware([]string{"*"}, []string{"GET"}))

http.ListenAndServe(":8484", chain(mux))
// Cada request produce:
// {"time":"...","level":"INFO","msg":"http request","app":"sqlite_api","method":"GET","path":"/health","status":200,"duration_ms":1}

Notas

Funcion impura — captura el status code con un loggerResponseWriter envolvente que intercepta WriteHeader. Si el handler no llama WriteHeader explicitamente el status por defecto es 200. La duracion se mide desde el inicio del middleware hasta despues de que el handler siguiente termine — incluye el tiempo de los middlewares internos pero no los externos en la cadena. El mensaje emitido es "http request" a nivel info para facilitar filtrado via msg:"http request" en queries downstream.