Files
loggerx/middleware.go
T

56 lines
1.3 KiB
Go
Raw Normal View History

2024-04-19 09:16:07 +08:00
package loggerx
import (
2024-05-11 16:48:31 +08:00
"bytes"
2024-04-19 09:16:07 +08:00
"context"
2024-05-11 16:48:31 +08:00
"io"
2024-05-11 17:07:17 +08:00
"net/http"
2024-04-19 09:16:07 +08:00
2024-05-11 16:48:31 +08:00
"github.com/gin-gonic/gin"
2024-04-19 09:16:07 +08:00
uuid "github.com/satori/go.uuid"
)
// 可以被引入的中间件
// 自动设置请求ID
2024-05-31 10:35:03 +08:00
func SetTraceId(ctx context.Context) context.Context {
return context.WithValue(ctx, "trace_id", uuid.NewV4().String())
2024-04-19 09:16:07 +08:00
}
2024-05-11 16:48:31 +08:00
// 中间件 gin框架保存请求相关信息
func MiddlewareGetGinParams(log *Logger) gin.HandlerFunc {
return func(ctx *gin.Context) {
2024-05-11 17:07:17 +08:00
// 使用bytes.Buffer来读取并记录请求体,同时避免改变ctx.Request.Body
2024-05-11 16:48:31 +08:00
buf := &bytes.Buffer{}
tea := io.TeeReader(ctx.Request.Body, buf)
2024-05-11 17:07:17 +08:00
// 读取body
2024-05-11 16:48:31 +08:00
body, err := io.ReadAll(tea)
if err != nil {
2024-05-11 17:07:17 +08:00
log.Infof(ctx, "Error reading request body: %v", err)
ctx.AbortWithStatus(http.StatusInternalServerError)
return
2024-05-11 16:48:31 +08:00
}
// 截取body的前1000个字符
2024-05-11 17:07:17 +08:00
bodyStr := string(body)
if len(bodyStr) > 1000 {
bodyStr = bodyStr[:1000]
}
2024-05-11 16:48:31 +08:00
2024-05-11 17:07:17 +08:00
// 使用NopCloser包裹buffer,仅为了确保在读取body之后body可以被关闭,但并不改变原始的Request.Body
2024-05-11 16:48:31 +08:00
ctx.Request.Body = io.NopCloser(buf)
m := map[string]interface{}{
"method": ctx.Request.Method,
"uri": ctx.Request.RequestURI,
2024-05-11 17:07:17 +08:00
"body": bodyStr,
2024-05-11 16:48:31 +08:00
"query": ctx.Request.URL.Query(),
"header": ctx.Request.Header,
}
log.Infof(ctx, "request %+v", m)
ctx.Next()
}
}