package spindle
import (
"log/slog"
"net/http"
"time"
)
func (s *Spindle) RequestLogger(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
next.ServeHTTP(w, r)
// Build query params as slog.Attrs for the group
queryParams := r.URL.Query()
queryAttrs := make([]any, 0, len(queryParams))
for key, values := range queryParams {
if len(values) == 1 {
queryAttrs = append(queryAttrs, slog.String(key, values[0]))
} else {
queryAttrs = append(queryAttrs, slog.Any(key, values))
}
}
s.l.LogAttrs(r.Context(), slog.LevelInfo, "",
slog.Group("request",
slog.String("method", r.Method),
slog.String("path", r.URL.Path),
slog.Group("query", queryAttrs...),
slog.Duration("duration", time.Since(start)),
),
)
})
}