logger.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package middleware
  2. import (
  3. "bytes"
  4. "gadmin/config"
  5. "github.com/gin-gonic/gin"
  6. "github.com/sirupsen/logrus"
  7. "io"
  8. "net/http"
  9. "time"
  10. )
  11. // Logger 访问日志
  12. func Logger(c *gin.Context) {
  13. var (
  14. start = time.Now() // 开始时间
  15. body []byte
  16. err error
  17. )
  18. if c.Request.Method != http.MethodGet {
  19. body, err = io.ReadAll(c.Request.Body)
  20. if err != nil {
  21. logrus.Warnf("read body from request error:%v", err)
  22. } else {
  23. c.Request.Body = io.NopCloser(bytes.NewBuffer(body))
  24. }
  25. }
  26. writer := responseBodyWriter{
  27. ResponseWriter: c.Writer,
  28. body: &bytes.Buffer{},
  29. }
  30. c.Writer = writer
  31. // 处理请求
  32. c.Next()
  33. // 结束时间
  34. var (
  35. getMap = make(map[string]interface{})
  36. headerMap = make(map[string]interface{})
  37. end = time.Now()
  38. )
  39. for k, v := range c.Request.URL.Query() {
  40. getMap[k] = v
  41. }
  42. for k, v := range c.Request.Header {
  43. headerMap[k] = v
  44. }
  45. //remark := ""
  46. //if c.Request.Method == http.MethodPost {
  47. // remark = config.GetMenuName(c.Request.URL.Path)
  48. //}
  49. //
  50. //logrus.Warnf("models:%#v", models)
  51. // 日志文件
  52. //config.AccessLog.WithFields(utility.JSONMethod(models)).Infoln()
  53. data := logrus.Fields{
  54. "clientIp": c.ClientIP(), // 访问IP
  55. "method": c.Request.Method, // 访问方式
  56. "get": c.Request.URL.Query().Encode(),
  57. "latency": end.Sub(start), // 执行事件
  58. "code": c.Writer.Status(), // 状态码
  59. "path": c.Request.URL.Path, // 访问路由
  60. "ua": c.Request.UserAgent(),
  61. }
  62. config.AccessLog.WithFields(data).Infoln()
  63. }
  64. type responseBodyWriter struct {
  65. gin.ResponseWriter
  66. body *bytes.Buffer
  67. }
  68. func (r responseBodyWriter) Write(b []byte) (int, error) {
  69. r.body.Write(b)
  70. return r.ResponseWriter.Write(b)
  71. }