| package middleware |
|
|
| import ( |
| "context" |
| "strings" |
|
|
| "github.com/Wei-Shaw/sub2api/internal/pkg/ctxkey" |
| "github.com/Wei-Shaw/sub2api/internal/pkg/logger" |
| "github.com/gin-gonic/gin" |
| "github.com/google/uuid" |
| "go.uber.org/zap" |
| ) |
|
|
| const requestIDHeader = "X-Request-ID" |
|
|
| |
| func RequestLogger() gin.HandlerFunc { |
| return func(c *gin.Context) { |
| if c.Request == nil { |
| c.Next() |
| return |
| } |
|
|
| requestID := strings.TrimSpace(c.GetHeader(requestIDHeader)) |
| if requestID == "" { |
| requestID = uuid.NewString() |
| } |
| c.Header(requestIDHeader, requestID) |
|
|
| ctx := context.WithValue(c.Request.Context(), ctxkey.RequestID, requestID) |
| clientRequestID, _ := ctx.Value(ctxkey.ClientRequestID).(string) |
|
|
| requestLogger := logger.With( |
| zap.String("component", "http"), |
| zap.String("request_id", requestID), |
| zap.String("client_request_id", strings.TrimSpace(clientRequestID)), |
| zap.String("path", c.Request.URL.Path), |
| zap.String("method", c.Request.Method), |
| ) |
|
|
| ctx = logger.IntoContext(ctx, requestLogger) |
| c.Request = c.Request.WithContext(ctx) |
| c.Next() |
| } |
| } |
|
|