智能在线客服系统源码GOFLY开发日志- 4. gin框架增加日志中间件
项目里面的 web 框架是 gin,这个框架给我的感觉就是非常的小巧实用。使用的时候,基础运用非常的简单,相信看看文档大家都能运行起来,没什么可说的。如果现在需求是增加一个日志中间件,记录下 http 请求的一些数据,并且需要按日期来生成每天的日志文件,我是这么做的。
使用的日志库是 github.com/sirupsen/logrus
我新建了一个 lib 包,里面专门放对第三方库的一些封装,比如我这个日志库
这个里面,使用了一下单例模式,不用每次都生成 logrus 结构实体。但是还需要每次都检测下每天的日志文件是否存在,所以专门加个函数处理,每天生成的日志文件,设置好 logrus 的输出对象
package lib import ( "github.com/sirupsen/logrus" "log" "os" "path" "time" ) var logrusObj *logrus.Logger func NewLogger(logDir string) *logrus.Logger { if logrusObj != nil { src, _ := setOutputFile(logDir) //设置输出 logrusObj.Out = src return logrusObj } //实例化 logger := logrus.New() src, _ := setOutputFile(logDir) //设置输出 logger.Out = src //设置日志级别 logger.SetLevel(logrus.DebugLevel) //设置日志格式 logger.SetFormatter(&logrus.TextFormatter{ TimestampFormat: "2006-01-02 15:04:05", }) logrusObj = logger return logger } func setOutputFile(logFilePath string) (*os.File, error) { now := time.Now() logFileName := now.Format("2006-01-02") + ".log" //日志文件 fileName := path.Join(logFilePath, logFileName) if _, err := os.Stat(fileName); err != nil { if _, err := os.Create(fileName); err != nil { log.Println(err.Error()) return nil, err } } //写入文件 src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend) if err != nil { log.Println(err) return nil, err } return src, nil }
我又建了一个 middleware 的包专门放中间件用
给 gin use 方法用的中间件函数,必须返回函数类型 gin.HandlerFunc
package middleware import ( "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "time" ) func NewMidLogger(logger *logrus.Logger) gin.HandlerFunc { return func(c *gin.Context) { // 开始时间 startTime := time.Now() // 处理请求 c.Next() // 结束时间 endTime := time.Now() // 执行时间 latencyTime := endTime.Sub(startTime) // 请求方式 reqMethod := c.Request.Method // 请求路由 reqUri := c.Request.RequestURI // 状态码 statusCode := c.Writer.Status() // 请求IP clientIP := c.ClientIP() //日志格式 logger.Infof("| %3d | %13v | %15s | %s | %s |", statusCode, latencyTime, clientIP, reqMethod, reqUri, ) } }
最后就是在 use 一下上面的中间件就可以了
engine := gin.Default() logger := lib.NewLogger(common.LogDirPath) engine.Use(middleware.NewMidLogger(logger))
后面还遇到了哪些问题和知识点将会继续进行总结。
演示网站:
gofly.sopans.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2019-02-15 [Go] golang原子函数实现goroutine同步
2019-02-15 [Go] golang原子函数锁住共享资源
2019-02-15 [PHP] 简单多进程并发