gin记录请求,返回结果日志

gin记录请求,返回结果日志

May 8, 2024
Go, Gin

gin的使用如何收集请求返回结果到日志

记录请求、应答中间件 #

  • 请求体只能读取一次,解决为重写进请求体
reqBody, _ := c.GetRawData()
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(reqBody))
  • 写入关键词 key(req、resp、func)便于排查分类
package middleware

import (
	"bytes"
	"io/ioutil"
	"time"

	"github.com/gin-gonic/gin"
	uuid "github.com/satori/go.uuid"
	"github.com/xiaohubai/alpha/config"
	"go.uber.org/zap"
)

func Logger() gin.HandlerFunc {
	return func(c *gin.Context) {
		start := time.Now()
		path := c.Request.RequestURI
		ip := c.ClientIP()
		mothod := c.Request.Method
		uid := uuid.NewV4().String()
		c.Set("trace_id", uid)
		reqBody, _ := c.GetRawData()
		c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(reqBody))
		config.LOG.Info(uid,
			zap.Any("key", "req"),
			zap.Any("ip", ip),
			zap.Any("path", path),
			zap.String("method", mothod),
			zap.Any("query", string(reqBody)),
		)

		c.Next()

		respBpdy, _ := c.Get("respBody")
		elapse := time.Since(start)
		config.LOG.Info(uid,
			zap.Any("key", "resp"),
			zap.String("ip", ip),
			zap.String("path", path),
			zap.String("method", mothod),
			zap.Duration("elapse", elapse),
			zap.Any("body", respBpdy),
		)
	}
}