package middleware import ( "fmt" "time" "github.com/gofiber/fiber/v2" "github.com/subconverter-go/internal/logging" ) // SetupLogging 设置日志中间件 // 记录所有HTTP请求的详细信息 func SetupLogging(logger *logging.Logger) fiber.Handler { return func(c *fiber.Ctx) error { start := time.Now() // 处理请求 err := c.Next() // 计算请求耗时 duration := time.Since(start) // 记录请求日志 logger.WithFields(map[string]interface{}{ "method": c.Method(), "path": c.Path(), "ip": c.IP(), "user_agent": c.Get("User-Agent"), "status": c.Response().StatusCode(), "duration": duration.Milliseconds(), "size": len(c.Response().Body()), }).Infof("HTTP %s %s - %d (%v)", c.Method(), c.Path(), c.Response().StatusCode(), duration) return err } } // SetupRequestID 设置请求ID中间件 // 为每个请求生成唯一ID,便于追踪和调试 func SetupRequestID() fiber.Handler { return func(c *fiber.Ctx) error { // 生成请求ID requestID := generateRequestID() // 设置到响应头 c.Set("X-Request-ID", requestID) // 存储到上下文 c.Locals("requestID", requestID) return c.Next() } } // generateRequestID 生成请求ID func generateRequestID() string { // 使用时间戳和随机数生成唯一ID return fmt.Sprintf("%d-%d", time.Now().UnixNano(), time.Now().Nanosecond()%1000000) }