前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Gin框架集成日志插件

Gin框架集成日志插件

原创
作者头像
海风极客
修改2023-12-11 22:58:56
2830
修改2023-12-11 22:58:56
举报
文章被收录于专栏:扯编程的淡扯编程的淡

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档