log.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package middleware
  2. import (
  3. "bytes"
  4. "github.com/gin-gonic/gin"
  5. "github.com/go-nunu/nunu-layout-advanced/pkg/helper/md5"
  6. "github.com/go-nunu/nunu-layout-advanced/pkg/helper/uuid"
  7. "github.com/go-nunu/nunu-layout-advanced/pkg/log"
  8. "go.uber.org/zap"
  9. "io"
  10. "time"
  11. )
  12. func RequestLogMiddleware(logger *log.Logger) gin.HandlerFunc {
  13. return func(ctx *gin.Context) {
  14. // The configuration is initialized once per request
  15. trace := md5.Md5(uuid.GenUUID())
  16. logger.WithValue(ctx, zap.String("trace", trace))
  17. logger.WithValue(ctx, zap.String("request_method", ctx.Request.Method))
  18. logger.WithValue(ctx, zap.Any("request_headers", ctx.Request.Header))
  19. logger.WithValue(ctx, zap.String("request_url", ctx.Request.URL.String()))
  20. if ctx.Request.Body != nil {
  21. bodyBytes, _ := ctx.GetRawData()
  22. ctx.Request.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) // 关键点
  23. logger.WithValue(ctx, zap.String("request_params", string(bodyBytes)))
  24. }
  25. logger.WithContext(ctx).Info("Request")
  26. ctx.Next()
  27. }
  28. }
  29. func ResponseLogMiddleware(logger *log.Logger) gin.HandlerFunc {
  30. return func(ctx *gin.Context) {
  31. blw := &bodyLogWriter{body: bytes.NewBufferString(""), ResponseWriter: ctx.Writer}
  32. ctx.Writer = blw
  33. startTime := time.Now()
  34. ctx.Next()
  35. duration := time.Since(startTime).String()
  36. ctx.Header("X-Response-Time", duration)
  37. logger.WithContext(ctx).Info("Response", zap.Any("response_body", blw.body.String()), zap.Any("time", duration))
  38. }
  39. }
  40. type bodyLogWriter struct {
  41. gin.ResponseWriter
  42. body *bytes.Buffer
  43. }
  44. func (w bodyLogWriter) Write(b []byte) (int, error) {
  45. w.body.Write(b)
  46. return w.ResponseWriter.Write(b)
  47. }