package middleware import ( "time" "github.com/gin-gonic/gin" "go.uber.org/zap" ) func Logger(log *zap.Logger) gin.HandlerFunc { return func(c *gin.Context) { start := time.Now() path := c.Request.URL.Path query := c.Request.URL.RawQuery c.Next() latency := time.Since(start) status := c.Writer.Status() requestID, _ := c.Get(RequestIDKey) fields := []zap.Field{ zap.Int("status", status), zap.String("method", c.Request.Method), zap.String("path", path), zap.Duration("latency", latency), zap.String("ip", c.ClientIP()), zap.Any("request_id", requestID), } if query != "" { fields = append(fields, zap.String("query", query)) } if len(c.Errors) > 0 { fields = append(fields, zap.String("errors", c.Errors.String())) } if status >= 500 { log.Error("request", fields...) } else if status >= 400 { log.Warn("request", fields...) } else { log.Info("request", fields...) } } }