结合 Logrus 和 Lumberjack,可以创建一个高效的日志中间件,用于记录请求和响应。以下是实现步骤:
1. 安装依赖
首先,确保安装了 Logrus 和 Lumberjack:
go get github.com/sirupsen/logrus
go get gopkg.in/natefinch/lumberjack.v2
2. 创建日志中间件
创建一个日志中间件,使用 Logrus 记录请求信息,并使用 Lumberjack 实现日志轮转:
package main
import (
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
"net/http"
)
func SetupLogger() *logrus.Logger {
logger := logrus.New()
logger.SetOutput(&lumberjack.Logger{
Filename: "log/gin.log",
MaxSize: 10, // MB
MaxBackups: 3,
MaxAge: 28, // days
Compress: true,
})
logger.SetFormatter(&logrus.TextFormatter{
FullTimestamp: true,
})
return logger
}
func LoggerMiddleware(logger *logrus.Logger) gin.HandlerFunc {
return func(c *gin.Context) {
logger.WithFields(logrus.Fields{
"method": c.Request.Method,
"path": c.Request.URL.Path,
}).Info("Request received")
c.Next() // 继续处理请求
logger.WithFields(logrus.Fields{
"status": c.Writer.Status(),
"method": c.Request.Method,
"path": c.Request.URL.Path,
}).Info("Response sent")
}
}
3. 使用中间件
在主函数中注册日志中间件:
func main() {
r := gin.Default()
logger := SetupLogger()
r.Use(LoggerMiddleware(logger))
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "pong"})
})
r.Run(":8080")
}
以下是汇总后的完整代码,包括使用 Logrus 和 Lumberjack 创建日志中间件的实现:
package main
import (
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
"net/http"
)
// 设置 Logger
func SetupLogger() *logrus.Logger {
logger := logrus.New()
logger.SetOutput(&lumberjack.Logger{
Filename: "log/gin.log",
MaxSize: 10, // MB
MaxBackups: 3,
MaxAge: 28, // days
Compress: true,
})
logger.SetFormatter(&logrus.TextFormatter{
FullTimestamp: true,
})
return logger
}
// 日志中间件
func LoggerMiddleware(logger *logrus.Logger) gin.HandlerFunc {
return func(c *gin.Context) {
logger.WithFields(logrus.Fields{
"method": c.Request.Method,
"path": c.Request.URL.Path,
}).Info("Request received")
c.Next() // 继续处理请求
logger.WithFields(logrus.Fields{
"status": c.Writer.Status(),
"method": c.Request.Method,
"path": c.Request.URL.Path,
}).Info("Response sent")
}
}
func main() {
r := gin.Default()
logger := SetupLogger()
r.Use(LoggerMiddleware(logger))
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "pong"})
})
r.Run(":8080")
}
代码说明
- SetupLogger:配置 Logrus 使用 Lumberjack 进行日志轮转。
- LoggerMiddleware:记录请求的 HTTP 方法和路径,以及响应状态。
- main:创建 Gin 引擎,注册日志中间件,并设置一个简单的
/ping
路由。
在运行代码之前,请确保创建一个名为 log
的文件夹,以便日志文件能够正确保存。运行后,您将在 log/gin.log
中找到日志记录。
总结
上述代码展示了如何结合 Logrus 和 Lumberjack 创建一个日志中间件,记录请求和响应信息,并实现日志文件的轮转管理。这种方式使得日志管理更加高效和灵活。