gin记录请求,返回结果日志
May 8, 2024
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),
)
}
}