Files
NetworkAuth/middleware/logging.go

93 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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()
}