package http import ( "log/slog" stdhttp "net/http" "time" "github.com/go-chi/chi/v5/middleware" ) // requestLogger emits one structured slog line per HTTP request. // Body sizes are best-effort (handlers that stream don't update them). func requestLogger(next stdhttp.Handler) stdhttp.Handler { return stdhttp.HandlerFunc(func(w stdhttp.ResponseWriter, r *stdhttp.Request) { start := time.Now() ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor) next.ServeHTTP(ww, r) slog.Info("http", "method", r.Method, "path", r.URL.Path, "status", ww.Status(), "bytes", ww.BytesWritten(), "dur_ms", time.Since(start).Milliseconds(), "req_id", middleware.GetReqID(r.Context()), "remote", r.RemoteAddr, ) }) }