84 lines
1.8 KiB
Go
84 lines
1.8 KiB
Go
package middleware
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/google/uuid"
|
|
"knowlege-lsxd/internal/logger"
|
|
"knowlege-lsxd/internal/types"
|
|
)
|
|
|
|
// RequestID middleware adds a unique request ID to the context
|
|
func RequestID() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
// Get request ID from header or generate a new one
|
|
requestID := c.GetHeader("X-Request-ID")
|
|
if requestID == "" {
|
|
requestID = uuid.New().String()
|
|
}
|
|
// Set request ID in header
|
|
c.Header("X-Request-ID", requestID)
|
|
|
|
// Set request ID in context
|
|
c.Set(types.RequestIDContextKey.String(), requestID)
|
|
|
|
// Set logger in context
|
|
requestLogger := logger.GetLogger(c)
|
|
requestLogger = requestLogger.WithField("request_id", requestID)
|
|
c.Set(types.LoggerContextKey.String(), requestLogger)
|
|
|
|
// Set request ID in the global context for logging
|
|
c.Request = c.Request.WithContext(
|
|
context.WithValue(
|
|
context.WithValue(c.Request.Context(), types.RequestIDContextKey, requestID),
|
|
types.LoggerContextKey, requestLogger,
|
|
),
|
|
)
|
|
|
|
c.Next()
|
|
}
|
|
}
|
|
|
|
// Logger middleware logs request details with request ID
|
|
func Logger() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
start := time.Now()
|
|
path := c.Request.URL.Path
|
|
raw := c.Request.URL.RawQuery
|
|
|
|
// Process request
|
|
c.Next()
|
|
|
|
// Get request ID from context
|
|
requestID, exists := c.Get(types.RequestIDContextKey.String())
|
|
if !exists {
|
|
requestID = "unknown"
|
|
}
|
|
|
|
// Calculate latency
|
|
latency := time.Since(start)
|
|
|
|
// Get client IP and status code
|
|
clientIP := c.ClientIP()
|
|
statusCode := c.Writer.Status()
|
|
method := c.Request.Method
|
|
|
|
if raw != "" {
|
|
path = path + "?" + raw
|
|
}
|
|
|
|
// Log with request ID
|
|
logger.GetLogger(c).Infof("[%s] %d | %3d | %13v | %15s | %s %s",
|
|
requestID,
|
|
statusCode,
|
|
c.Writer.Size(),
|
|
latency,
|
|
clientIP,
|
|
method,
|
|
path,
|
|
)
|
|
}
|
|
}
|