logger_mw.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package middleware
  2. import (
  3. "fmt"
  4. "github.com/gin-gonic/gin"
  5. rotatelogs "github.com/lestrrat-go/file-rotatelogs"
  6. "github.com/rifflock/lfshook"
  7. "github.com/sirupsen/logrus"
  8. "os"
  9. "path"
  10. "time"
  11. )
  12. var (
  13. logFilePath = "./log/"
  14. logFileName = "system.log"
  15. )
  16. func LoggerMiddleware() gin.HandlerFunc {
  17. // 日志文件
  18. fileName := path.Join(logFilePath, logFileName)
  19. // 写入文件
  20. src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
  21. if err != nil {
  22. fmt.Println("err", err)
  23. }
  24. // 实例化
  25. logger := logrus.New()
  26. //设置日志级别
  27. logger.SetLevel(logrus.DebugLevel)
  28. //设置输出
  29. logger.Out = src
  30. // 设置 rotatelogs
  31. logWriter, err := rotatelogs.New(
  32. // 分割后的文件名称
  33. fileName+".%Y%m%d.log",
  34. // 生成软链,指向最新日志文件
  35. rotatelogs.WithLinkName(fileName),
  36. // 设置最大保存时间(7天)
  37. rotatelogs.WithMaxAge(7*24*time.Hour),
  38. // 设置日志切割时间间隔(1天)
  39. rotatelogs.WithRotationTime(24*time.Hour),
  40. )
  41. writeMap := lfshook.WriterMap{
  42. logrus.InfoLevel: logWriter,
  43. logrus.FatalLevel: logWriter,
  44. logrus.DebugLevel: logWriter,
  45. logrus.WarnLevel: logWriter,
  46. logrus.ErrorLevel: logWriter,
  47. logrus.PanicLevel: logWriter,
  48. }
  49. logger.AddHook(lfshook.NewHook(writeMap, &logrus.JSONFormatter{
  50. TimestampFormat: "2006-01-02 15:04:05",
  51. }))
  52. return func(c *gin.Context) {
  53. //开始时间
  54. startTime := time.Now()
  55. //处理请求
  56. c.Next()
  57. //结束时间
  58. endTime := time.Now()
  59. // 执行时间
  60. latencyTime := endTime.Sub(startTime)
  61. //请求方式
  62. reqMethod := c.Request.Method
  63. //请求路由
  64. reqUrl := c.Request.RequestURI
  65. //状态码
  66. statusCode := c.Writer.Status()
  67. //请求ip
  68. clientIP := c.ClientIP()
  69. // 日志格式
  70. logger.WithFields(logrus.Fields{
  71. "status_code": statusCode,
  72. "latency_time": latencyTime,
  73. "client_ip": clientIP,
  74. "req_method": reqMethod,
  75. "req_uri": reqUrl,
  76. }).Info()
  77. }
  78. }