Files
2026-06-27 08:12:26 +08:00

37 lines
965 B
Go

package middleware
import (
"strings"
"time"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
// RequestLogger logs one structured line per request.
//
// 健康检查与静态资源的成功请求被跳过:healthcheck 每 30s 一次、SPA 静态
// 文件每页几十个请求,全部记 INFO 会让日志在几小时内膨胀到几十 MB,
// 在 Docker json-file 日志驱动下白白消耗磁盘 IO。
func RequestLogger(log *zap.Logger) gin.HandlerFunc {
return func(c *gin.Context) {
start := time.Now()
c.Next()
path := c.Request.URL.Path
status := c.Writer.Status()
if status < 400 {
if path == "/api/health" || strings.HasPrefix(path, "/assets/") ||
path == "/favicon.ico" || path == "/favicon.svg" {
return
}
}
log.Info("http",
zap.String("method", c.Request.Method),
zap.String("path", path),
zap.Int("status", status),
zap.Duration("dur", time.Since(start)),
zap.String("ip", c.ClientIP()),
)
}
}