package middleware import ( "log/slog" "net/url" "strings" "time" "github.com/gin-gonic/gin" ) // sanitizeQuery 对 query 中的敏感参数值脱敏,避免日志泄露 token/code/密钥等。 func sanitizeQuery(query string) string { if query == "" { return "" } values, err := url.ParseQuery(query) if err != nil { return "***" } sensitive := map[string]bool{ "token": true, "code": true, "secret": true, "password": true, "access_token": true, "refresh_token": true, "key": true, } for k := range values { if sensitive[strings.ToLower(k)] { values.Set(k, "***") } } return values.Encode() } func GinSlogMiddleware() gin.HandlerFunc { return func(c *gin.Context) { start := time.Now() path := c.Request.URL.Path query := sanitizeQuery(c.Request.URL.RawQuery) // 处理请求 c.Next() // 请求结束后打日志 slog.InfoContext(c.Request.Context(), "GIN_REQUEST", "request_id", GetRequestID(c.Request.Context()), "method", c.Request.Method, "path", path, "query", query, "status", c.Writer.Status(), "ip", c.ClientIP(), "latency", time.Since(start).String(), "user_agent", c.Request.UserAgent(), ) } }