34 lines
982 B
Go
34 lines
982 B
Go
package middleware
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// Logger middleware for structured logging
|
|
func Logger(logger *zap.Logger) gin.HandlerFunc {
|
|
return gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
|
|
logger.Info("HTTP request",
|
|
zap.String("method", param.Method),
|
|
zap.String("path", param.Path),
|
|
zap.Int("status", param.StatusCode),
|
|
zap.Duration("latency", param.Latency),
|
|
zap.String("client_ip", param.ClientIP),
|
|
zap.String("user_agent", param.Request.UserAgent()),
|
|
)
|
|
return ""
|
|
})
|
|
}
|
|
|
|
// Recovery middleware with structured logging
|
|
func Recovery(logger *zap.Logger) gin.HandlerFunc {
|
|
return gin.RecoveryWithWriter(gin.DefaultWriter, func(c *gin.Context, recovered interface{}) {
|
|
logger.Error("Panic recovered",
|
|
zap.Any("error", recovered),
|
|
zap.String("method", c.Request.Method),
|
|
zap.String("path", c.Request.URL.Path),
|
|
zap.String("client_ip", c.ClientIP()),
|
|
)
|
|
c.AbortWithStatus(500)
|
|
})
|
|
} |