package middleware import ( "time" "github.com/gin-gonic/gin" "go.uber.org/zap" ) // Logger returns a middleware that logs HTTP requests using zap logger func Logger(logger *zap.Logger) gin.HandlerFunc { return func(c *gin.Context) { // Start timer start := time.Now() // Process request c.Next() // Calculate latency latency := time.Since(start) // Get request information method := c.Request.Method path := c.Request.URL.Path query := c.Request.URL.RawQuery status := c.Writer.Status() clientIP := c.ClientIP() userAgent := c.Request.UserAgent() // Get error if any errorMessage := c.Errors.ByType(gin.ErrorTypePrivate).String() // Build log fields fields := []zap.Field{ zap.String("method", method), zap.String("path", path), zap.String("query", query), zap.Int("status", status), zap.String("client_ip", clientIP), zap.String("user_agent", userAgent), zap.Duration("latency", latency), zap.Int64("latency_ms", latency.Nanoseconds()/1000000), } // Add error field if exists if errorMessage != "" { fields = append(fields, zap.String("error", errorMessage)) } // Log based on status code switch { case status >= 500: logger.Error("HTTP Request", fields...) case status >= 400: logger.Warn("HTTP Request", fields...) default: logger.Info("HTTP Request", fields...) } } }