73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
// 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)
|
|
}
|
|
}
|