package logger import ( "fmt" "github.com/gin-gonic/gin" "idou-server/pkg/file" "log" "os" "time" ) var formatter = func(param gin.LogFormatterParams) string { var statusColor, methodColor, resetColor string if param.IsOutputColor() { statusColor = param.StatusCodeColor() methodColor = param.MethodColor() resetColor = param.ResetColor() } if param.Latency > time.Minute { param.Latency = param.Latency.Truncate(time.Second) } return fmt.Sprintf("[GIN] %v |%s %3d %s| %13v | %15s |%s %-7s %s %#v\n%s", param.TimeStamp.Format("2006/01/02 - 15:04:05"), statusColor, param.StatusCode, resetColor, param.Latency, param.ClientIP, methodColor, param.Method, resetColor, param.Path, param.ErrorMessage, ) } func LoggerHandler() gin.HandlerFunc { out, err := file.MustOpen("gin-request.log", os.Getenv("LOG_SAVE_PATH")) if err != nil { log.Fatalf("logging.gin err: %v", err) } return func(c *gin.Context) { // Start timer start := time.Now() path := c.Request.URL.Path raw := c.Request.URL.RawQuery // Process request c.Next() if out != nil { // Log only when path is not being skipped param := gin.LogFormatterParams{ Request: c.Request, Keys: c.Keys, } // Stop timer param.TimeStamp = time.Now() param.Latency = param.TimeStamp.Sub(start) param.ClientIP = c.ClientIP() param.Method = c.Request.Method param.StatusCode = c.Writer.Status() param.ErrorMessage = c.Errors.ByType(gin.ErrorTypePrivate).String() param.BodySize = c.Writer.Size() if raw != "" { path = path + "?" + raw } param.Path = path fmt.Fprint(out, formatter(param)) if gin.Mode() == gin.DebugMode { fmt.Fprint(os.Stdout, formatter(param)) } } } }