package middleware import ( "net/http" "time" "go.uber.org/zap" ) // LoggerMiddleware logs HTTP requests func LoggerMiddleware(logger *zap.Logger) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() // Wrap response writer to capture status code wrapped := &responseWriter{ResponseWriter: w, statusCode: http.StatusOK} next.ServeHTTP(wrapped, r) duration := time.Since(start) logger.Info("HTTP request", zap.String("method", r.Method), zap.String("path", r.URL.Path), zap.Int("status", wrapped.statusCode), zap.Duration("duration", duration), ) }) } } type responseWriter struct { http.ResponseWriter statusCode int } func (rw *responseWriter) WriteHeader(code int) { rw.statusCode = code rw.ResponseWriter.WriteHeader(code) }