package middleware import ( "log/slog" "net/http" "time" ) type LoggerMiddleware struct { } func NewLoggerMiddleware() *LoggerMiddleware { return &LoggerMiddleware{} } func (m *LoggerMiddleware) Middleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { reqCtx := GetRequestContext(r.Context()) rw := NewResponseRecorder(w) next.ServeHTTP(rw, r) fields := []any{ "request_id", reqCtx.RequestID, "method", reqCtx.Method, "path", reqCtx.Path, "status", rw.statusCode, "start_time", reqCtx.StartTime, "duration", time.Since(reqCtx.StartTime), "client_ip", reqCtx.ClientIp, } if rw.errorMsg != "" { fields = append(fields, "error", rw.errorMsg) } switch { case rw.statusCode >= 500: slog.Error("request", fields...) case rw.statusCode >= 400: slog.Warn("request", fields...) default: slog.Info("request", fields...) } }) }