Gin框架集成日志插件的好处主要有以下几点:
日志管理:Gin框架支持按天、小时、分钟等单位来分割日志,通过设置日志分割规则和文件数量等信息,可以将日志分割为多个文件,方便日志管理和分析。
故障排查:在实际项目开发中,日志功能非常实用。例如,在Web应用程序中,可以使用日志记录HTTP请求和响应信息,方便排查问题。例如,可以记录HTTP请求的URL、请求方法、请求参数等信息,方便后期分析和优化。
系统监控:通过分析日志数据,可以实时监控系统的运行状态,及时发现和解决潜在的问题,确保系统的稳定性和可用性。
安全审计:日志可以记录系统的操作行为,包括用户登录、操作记录、异常行为等,对于安全审计和溯源非常有帮助。
性能优化:通过分析日志数据,可以了解系统的性能瓶颈和优化空间,针对性地进行优化和改进,提高系统的性能和响应速度。
下面是整体架构图:
本次我们使用的日志插件为logrus,下面是代码:
代码语言:go复制import (
"bytes"
"fmt"
"io"
"math"
"os"
"time"
"github.com/gin-gonic/gin"
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"github.com/sirupsen/logrus"
)
func init() {
logrus.SetFormatter(&GinFormatter{})
logPath, _ := os.Getwd()
logName := fmt.Sprintf("%s/gin-log-", logPath)
r, _ := rotatelogs.New(logName "%Y%m%d.log")
logrus.SetOutput(io.MultiWriter(os.Stdout, r))
}
type GinFormatter struct{}
func (m *GinFormatter) Format(entry *logrus.Entry) ([]byte, error) {
var b *bytes.Buffer
if entry.Buffer != nil {
b = entry.Buffer
} else {
b = &bytes.Buffer{}
}
b.WriteString(fmt.Sprintf("[%s] [%s] %sn", entry.Time.Format("2006-01-02 15:04:05"), entry.Level, entry.Message))
return b.Bytes(), nil
}
func LogMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
startTime := time.Now()
c.Next()
customTime := fmt.Sprintf("%dms", int(math.Ceil(float64(time.Since(startTime).Nanoseconds()/1000000))))
logrus.Infof("Gin log method:% v , path:% v , status:% v , tc:% v",
c.Request.Method, c.Request.RequestURI, c.Writer.Status(), customTime)
}
}
main函数代码:
代码语言:go复制import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
)
func main() {
g := gin.Default()
g.Use(LogMiddleware())
g.GET("/log", func(c *gin.Context) {
str,_ := c.GetQuery("s")
logrus.Warnf("Log request = %s", str)
c.JSON(http.StatusOK, "This is log api")
})
_ = g.Run(":8080")
}
init函数:
设置logrus的输出格式为GinFormatter,这样logrus会按照GinFormatter定义的格式来输出日志。
定义日志文件的存储路径和名称,每天都会生成一个新的日志文件,文件名格式为<logPath>/gin-log-<年月日>.log。
使用rotatelogs库实现日志文件的轮换,当日志文件到达设定的最大大小或者日期时,会自动创建新的日志文件,并删除最旧的日志文件。
GinFormatter结构体:
定义了一个GinFormatter结构体,实现了logrus需要的日志格式化接口。
Format方法定义了日志的输出格式,输出的日志格式为时间 消息。
LogMiddleware:
定义了一个中间件函数,用于处理Gin的每个请求。
在请求开始时记录时间。
在请求结束时,记录请求的方法、路径、状态码以及请求处理的时间(以毫秒为单位)。
使用logrus输出日志。
效果图:
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!