自定义Gin日志中间件:深入解析与实现
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
"time"
)
// 自定义日志格式
type customLogger struct {
method string
url string
status int
start time.Time
}
// 实现 gin.HandlerFunc 接口
func (c *customLogger) Write(p []byte) (n int, err error) {
fmt.Printf("[%s] %q %d %v\n", c.method, c.url, c.status, time.Since(c.start))
return len(p), nil
}
// Logger 中间件
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
start := time.Now()
path := c.Request.URL.Path
logger := &customLogger{
method: c.Request.Method,
url: path,
start: start,
}
// 重写 ResponseWriter 的 Write 方法
c.Writer = logger
// 继续执行其他的中间件和处理函数
c.Next()
// 当所有中间件和处理函数执行完毕后,记录响应状态码
logger.status = c.Writer.Status()
}
}
func main() {
r := gin.Default()
// 使用自定义的Logger中间件
r.Use(Logger())
r.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello World!")
})
// 启动服务器
r.Run(":8080")
}
这段代码定义了一个自定义的日志中间件Logger
,它会记录每个请求的HTTP方法、URL、响应时间和状态码。在main
函数中,我们使用r.Use(Logger())
来应用这个中间件。当服务器接收到请求时,Logger
中间件会记录请求的开始时间,并在请求处理完毕后记录状态码和响应时间。
评论已关闭