40 lines
808 B
Go
40 lines
808 B
Go
package middleware
|
|
|
|
import (
|
|
"bytes"
|
|
|
|
"yh_web/server/pkg/logger"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// responseBodyWriter 包装 ResponseWriter 以捕获响应体
|
|
type responseBodyWriter struct {
|
|
gin.ResponseWriter
|
|
body *bytes.Buffer
|
|
}
|
|
|
|
func (w responseBodyWriter) Write(b []byte) (int, error) {
|
|
w.body.Write(b)
|
|
return w.ResponseWriter.Write(b)
|
|
}
|
|
|
|
// ErrorLogger 在 4xx/5xx 时记录响应体中的错误信息
|
|
func ErrorLogger() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
w := &responseBodyWriter{
|
|
ResponseWriter: c.Writer,
|
|
body: &bytes.Buffer{},
|
|
}
|
|
c.Writer = w
|
|
|
|
c.Next()
|
|
|
|
if w.Status() >= 400 {
|
|
if body := w.body.String(); body != "" {
|
|
logger.Err("middleware/logger", "[%d] %s %s | body: %s", w.Status(), c.Request.Method, c.Request.URL.Path, body)
|
|
}
|
|
}
|
|
}
|
|
}
|