/* @Time : 2019-06-28 17:48 @Author : zr @File : logger @Software: GoLand */ package middleware import ( "encoding/json" "github.com/ZR233/goutils/stackx" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "time" "video_course/errors" "video_course/model" ) func Logger() gin.HandlerFunc { return func(c *gin.Context) { beginTime := time.Now() defer func() { code := 0 logMsg := "success" if p := recover(); p != nil { err := p.(error) stdErr := errors.FromError(err) logMsg = stdErr.Error() + "\n" + string(stackx.Stack(0)) code = int(stdErr.Code) _ = c.Error(err) } userid := 0 src := "" endTime := time.Now() if i, exists := c.Get("session"); exists { s, ok := i.(*model.Session) if ok { if s != nil { userid = s.UserId src = s.Channel } } } postForm := c.Request.PostForm params, _ := json.Marshal(postForm) url := c.Request.URL.Path event := logrus.WithFields(logrus.Fields{ "execTime": endTime.Sub(beginTime).Milliseconds(), "trace": url, "optUserId": userid, "src": src, "code": code, "params": string(params), }) event.Time = beginTime if len(c.Errors) > 0 { event.Warn(logMsg) } else { event.Info(logMsg) } }() c.Next() } }