// Package middle middle_logger.go package middle import ( "bytes" "fmt" "io" "log" "time" "github.com/gin-gonic/gin" ) func RequestResponseLogger() gin.HandlerFunc { return func(ctx *gin.Context) { // 保存原始请求体 var bodyBytes []byte if ctx.Request.Body != nil { bodyBytes, _ = io.ReadAll(ctx.Request.Body) // 恢复请求体,供后续处理使用 ctx.Request.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) } // 获取查询参数 queryParams := ctx.Request.URL.Query().Encode() // 获取请求头信息 var headers string _ = ctx.GetHeader("Authorization") //headers = fmt.Sprintf("Authorization: %s; ", Token) // 记录开始时间 startTime := time.Now() // 继续处理请求 ctx.Next() // 计算处理时间 latency := time.Since(startTime) // 格式化日志内容 timestamp := time.Now().Format("2006/01/02 15:04:05") // 格式化日志内容 logMessage := fmt.Sprintf("[GIN] Request | %3d | %13v | %15s | %-7s %s", ctx.Writer.Status(), latency, ctx.ClientIP(), ctx.Request.Method, ctx.Request.URL.Path, ) // 单独打印查询参数(带时间戳) if queryParams != "" { logMessage += fmt.Sprintf("\n%s [GIN] Params: %s", timestamp, queryParams) } // 单独打印请求体(带时间戳) if len(bodyBytes) > 0 { logMessage += fmt.Sprintf("\n%s [GIN] Body: %s", timestamp, string(bodyBytes)) } // 单独打印请求头(带时间戳) if headers != "" { logMessage += fmt.Sprintf("\n%s [GIN] Headers: %s", timestamp, headers) } // 输出到控制台 log.Println(logMessage) } }