logger.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package middleware
  2. import (
  3. "dy-admin/pkg/log"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "github.com/mattn/go-isatty"
  7. "os"
  8. "time"
  9. )
  10. var defaultLogFormatter = 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. // Truncate in a golang < 1.8 safe way
  19. param.Latency = param.Latency - param.Latency%time.Second
  20. }
  21. return fmt.Sprintf("%s%3d%s - [%s] \"%v %s%s%s %s\" %s",
  22. // param.TimeStamp.Format("2006/01/02 - 15:04:05"),
  23. statusColor, param.StatusCode, resetColor,
  24. param.ClientIP,
  25. param.Latency,
  26. methodColor, param.Method, resetColor,
  27. param.Path,
  28. param.ErrorMessage,
  29. )
  30. }
  31. func Logger() gin.HandlerFunc {
  32. return LoggerWithConfig(gin.LoggerConfig{
  33. Formatter: defaultLogFormatter,
  34. Output: nil,
  35. SkipPaths: nil,
  36. })
  37. }
  38. func LoggerWithConfig(conf gin.LoggerConfig) gin.HandlerFunc {
  39. formatter := conf.Formatter
  40. if formatter == nil {
  41. formatter = defaultLogFormatter
  42. }
  43. out := conf.Output
  44. if out == nil {
  45. out = gin.DefaultWriter
  46. }
  47. notlogged := conf.SkipPaths
  48. isTerm := true
  49. if w, ok := out.(*os.File); !ok || os.Getenv("TERM") == "dumb" ||
  50. (!isatty.IsTerminal(w.Fd()) && !isatty.IsCygwinTerminal(w.Fd())) {
  51. isTerm = false
  52. }
  53. if isTerm {
  54. gin.ForceConsoleColor()
  55. }
  56. var skip map[string]struct{}
  57. if length := len(notlogged); length > 0 {
  58. skip = make(map[string]struct{}, length)
  59. for _, path := range notlogged {
  60. skip[path] = struct{}{}
  61. }
  62. }
  63. return func(c *gin.Context) {
  64. // Start timer
  65. start := time.Now()
  66. path := c.Request.URL.Path
  67. raw := c.Request.URL.RawQuery
  68. // Process request
  69. c.Next()
  70. // Log only when path is not being skipped
  71. if _, ok := skip[path]; !ok {
  72. param := gin.LogFormatterParams{
  73. Request: c.Request,
  74. Keys: c.Keys,
  75. }
  76. // Stop timer
  77. param.TimeStamp = time.Now()
  78. param.Latency = param.TimeStamp.Sub(start)
  79. param.ClientIP = c.ClientIP()
  80. param.Method = c.Request.Method
  81. param.StatusCode = c.Writer.Status()
  82. param.ErrorMessage = c.Errors.ByType(gin.ErrorTypePrivate).String()
  83. param.BodySize = c.Writer.Size()
  84. if raw != "" {
  85. path = path + "?" + raw
  86. }
  87. param.Path = path
  88. log.L(c).Info(formatter(param))
  89. }
  90. }
  91. }