Gin框架集成日志插件

2023-12-11 22:58:56 浏览数 (1)

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腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

0 人点赞