package middleware import ( "github.com/gin-gonic/gin" "go.uber.org/zap" "leafdev.top/Ecosystem/recommender/internal/base/logger" "time" ) type GinLoggerMiddleware struct { logger *logger.Logger } func NewGinLoggerMiddleware(logger *logger.Logger) *GinLoggerMiddleware { return &GinLoggerMiddleware{ logger: logger, } } // GinLogger 接收gin框架默认的日志 func (l *GinLoggerMiddleware) GinLogger(c *gin.Context) { start := time.Now() path := c.Request.URL.Path query := c.Request.URL.RawQuery c.Next() cost := time.Since(start) l.logger.Logger.Info(path, zap.Int("status", c.Writer.Status()), zap.String("method", c.Request.Method), zap.String("path", path), zap.String("query", query), zap.String("ip", c.ClientIP()), zap.String("user-agent", c.Request.UserAgent()), zap.String("errors", c.Errors.ByType(gin.ErrorTypePrivate).String()), zap.Duration("cost", cost), ) } // //// GinRecovery recover掉项目可能出现的panic //func GinRecovery(logger *zap.Logger, stack bool) gin.HandlerFunc { // return func(c *gin.Context) { // defer func() { // if err := recover(); err != nil { // // Check for a broken connection, as it is not really a // // condition that warrants a panic stack trace. // var brokenPipe bool // if ne, ok := err.(*net.OpError); ok { // if se, ok := ne.Err.(*os.SyscallError); ok { // if strings.Contains(strings.ToLower(se.Error()), "broken pipe") || strings.Contains(strings.ToLower(se.Error()), "connection reset by peer") { // brokenPipe = true // } // } // } // // httpRequest, _ := httputil.DumpRequest(c.Request, false) // if brokenPipe { // logger.Error(c.Request.URL.Path, // zap.Any("error", err), // zap.String("request", string(httpRequest)), // ) // // If the connection is dead, we can't write a status to it. // c.Error(err.(error)) // nolint: errcheck // c.Abort() // return // } // // if stack { // logger.Error("[Recovery from panic]", // zap.Any("error", err), // zap.String("request", string(httpRequest)), // zap.String("stack", string(debug.Stack())), // ) // } else { // logger.Error("[Recovery from panic]", // zap.Any("error", err), // zap.String("request", string(httpRequest)), // ) // } // c.AbortWithStatus(http.StatusInternalServerError) // } // }() // c.Next() // } //}