mirror of
https://github.com/skyle1995/NetworkAuth.git
synced 2026-05-25 02:24:05 +08:00
93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
package middleware
|
||
|
||
import (
|
||
"time"
|
||
|
||
"NetworkAuth/utils/logger"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/sirupsen/logrus"
|
||
"github.com/spf13/viper"
|
||
)
|
||
|
||
// ============================================================================
|
||
// 结构体定义
|
||
// ============================================================================
|
||
|
||
// LoggingMiddleware 日志记录中间件结构体
|
||
// 用于记录HTTP请求的详细信息,包括方法、路径、状态码和响应时间
|
||
type LoggingMiddleware struct {
|
||
logger *logger.Logger
|
||
}
|
||
|
||
// ============================================================================
|
||
// 构造函数
|
||
// ============================================================================
|
||
|
||
// NewLoggingMiddleware 创建新的日志记录中间件实例
|
||
func NewLoggingMiddleware(logger *logger.Logger) *LoggingMiddleware {
|
||
return &LoggingMiddleware{
|
||
logger: logger,
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// 中间件函数
|
||
// ============================================================================
|
||
|
||
// Handler 返回Gin中间件函数,用于记录HTTP请求日志
|
||
// 记录格式参考了更灵活的NetworkAuth实现,支持配置开关和日志级别检查
|
||
func (lm *LoggingMiddleware) Handler() gin.HandlerFunc {
|
||
return func(c *gin.Context) {
|
||
// 检查是否启用了访问日志
|
||
if !viper.GetBool("server.access_log") {
|
||
c.Next()
|
||
return
|
||
}
|
||
|
||
// 如果日志级别不是Debug或更高(Trace),则不记录访问日志
|
||
// 避免在Info级别输出过多的访问日志干扰正常业务日志
|
||
if lm.logger.Level < logrus.DebugLevel {
|
||
c.Next()
|
||
return
|
||
}
|
||
|
||
start := time.Now()
|
||
path := c.Request.URL.Path
|
||
raw := c.Request.URL.RawQuery
|
||
|
||
// 处理请求
|
||
c.Next()
|
||
|
||
// 计算响应时间
|
||
duration := time.Since(start)
|
||
|
||
if raw != "" {
|
||
path = path + "?" + raw
|
||
}
|
||
|
||
// 记录请求日志
|
||
lm.logger.LogRequestWithHeaders(
|
||
c.Request.Method,
|
||
path,
|
||
c.ClientIP(), // 使用 Gin 内置的方法获取 IP
|
||
c.Writer.Status(),
|
||
duration,
|
||
c.Errors.ByType(gin.ErrorTypePrivate).String(),
|
||
c.Request.UserAgent(),
|
||
)
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// 公共函数
|
||
// ============================================================================
|
||
|
||
// WrapHandler 创建Gin日志中间件
|
||
// 使用全局日志记录器创建日志中间件
|
||
func WrapHandler() gin.HandlerFunc {
|
||
log := logger.GetLogger()
|
||
middleware := NewLoggingMiddleware(log)
|
||
return middleware.Handler()
|
||
}
|