log.go 1.7 KB

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