package server import ( "fmt" "net/http" "time" "github.com/deluan/navidrome/log" "github.com/go-chi/chi/middleware" ) func RequestLogger(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { scheme := "http" if r.TLS != nil { scheme = "https" } start := time.Now() ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor) next.ServeHTTP(ww, r) status := ww.Status() message := fmt.Sprintf("HTTP: %s %s://%s%s", r.Method, scheme, r.Host, r.RequestURI) logArgs := []interface{}{ r.Context(), message, "remoteAddr", r.RemoteAddr, "elapsedTime", time.Since(start), "httpStatus", ww.Status(), "responseSize", ww.BytesWritten(), } if log.CurrentLevel() >= log.LevelDebug { logArgs = append(logArgs, "userAgent", r.UserAgent()) } switch { case status >= 500: log.Error(logArgs...) case status >= 400: log.Warn(logArgs...) default: log.Debug(logArgs...) } }) }