logger.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package logger
  2. import (
  3. "dsbqj-admin/pkg/file"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "log"
  7. "os"
  8. "time"
  9. )
  10. var formatter = func(param gin.LogFormatterParams) string {
  11. var statusColor, methodColor, resetColor string
  12. if param.IsOutputColor() {
  13. statusColor = param.StatusCodeColor()
  14. methodColor = param.MethodColor()
  15. resetColor = param.ResetColor()
  16. }
  17. if param.Latency > time.Minute {
  18. param.Latency = param.Latency.Truncate(time.Second)
  19. }
  20. return fmt.Sprintf("[GIN] %v |%s %3d %s| %13v | %15s |%s %-7s %s %#v\n%s",
  21. param.TimeStamp.Format("2006/01/02 - 15:04:05"),
  22. statusColor, param.StatusCode, resetColor,
  23. param.Latency,
  24. param.ClientIP,
  25. methodColor, param.Method, resetColor,
  26. param.Path,
  27. param.ErrorMessage,
  28. )
  29. }
  30. func LoggerHandler() gin.HandlerFunc {
  31. out, err := file.MustOpen("gin-request.log", os.Getenv("LOG_SAVE_PATH"))
  32. if err != nil {
  33. log.Fatalf("logging.gin err: %v", err)
  34. }
  35. return func(c *gin.Context) {
  36. // Start timer
  37. start := time.Now()
  38. path := c.Request.URL.Path
  39. raw := c.Request.URL.RawQuery
  40. // Process request
  41. c.Next()
  42. if out != nil {
  43. // Log only when path is not being skipped
  44. param := gin.LogFormatterParams{
  45. Request: c.Request,
  46. Keys: c.Keys,
  47. }
  48. // Stop timer
  49. param.TimeStamp = time.Now()
  50. param.Latency = param.TimeStamp.Sub(start)
  51. param.ClientIP = c.ClientIP()
  52. param.Method = c.Request.Method
  53. param.StatusCode = c.Writer.Status()
  54. param.ErrorMessage = c.Errors.ByType(gin.ErrorTypePrivate).String()
  55. param.BodySize = c.Writer.Size()
  56. if raw != "" {
  57. path = path + "?" + raw
  58. }
  59. param.Path = path
  60. fmt.Fprint(out, formatter(param))
  61. if gin.Mode() == gin.DebugMode {
  62. fmt.Fprint(os.Stdout, formatter(param))
  63. }
  64. }
  65. }
  66. }