代码:
package main
import (
"time"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
)
func LoggerMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 记录请求开始时间
start := time.Now()
// 处理请求
c.Next()
// 计算请求处理时间
latency := time.Since(start)
statusCode := c.Writer.Status()
clientIP := c.ClientIP()
method := c.Request.Method
path := c.Request.URL.Path
logrus.WithFields(logrus.Fields{
"status": statusCode,
"latency": latency,
"ip": clientIP,
"method": method,
"path": path,
}).Info("Request completed")
}
}
func main() {
router := gin.Default()
// 添加日志中间件
router.Use(LoggerMiddleware())
// 定义一个简单的路由
router.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
router.Run(":8080")
}
调试控制台输出示例:
time="2024-10-30T17:46:29+08:00" level=info msg="Request completed" ip=127.0.0.1 latency=0s method=GET path=/ping status=200
[GIN] 2024/10/30 - 17:46:29 | 200 | 898.6µs | 127.0.0.1 | GET "/ping"
time="2024-10-30T17:46:32+08:00" level=info msg="Request completed" ip=127.0.0.1 latency=0s method=GET path=/ping status=200
[GIN] 2024/10/30 - 17:46:32 | 200 | 198µs | 127.0.0.1 | GET "/ping"
time="2024-10-30T17:46:32+08:00" level=info msg="Request completed" ip=127.0.0.1 latency=0s method=GET path=/ping status=200
[GIN] 2024/10/30 - 17:46:32 | 200 | 85.9µs | 127.0.0.1 | GET "/ping"
说明:
1.用到三个包,go内置的time包,第三方包:gin框架包和logrus包。
2.使用gin创建服务器后,用Use方法添加中间件函数LoggerMiddleware。
3.LoggerMiddleware函数中,logrus包的操作方法依赖gin包的功能,该函数返回一个匿名函数,匿名函数的参数为*gin.Context类型,用于处理http请求。
4.logrus.WithFields是logrus日志库中的一个方法,用于创建一个新的日志记录器并添加一些字段信息到日志中。
5.logrus.Fields各个参数解释:
- status:请求状态码,如200,404等
- latency:请求用时
- ip:客户端ip地址
- method:请求方法
- path:请求路径