智能在线客服系统源码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))
gorm也整合上,非常简单,调用一下db对象的一个方法,把logger传进去
DB.SetLogger(logger)
后面还遇到了哪些问题和知识点将会继续进行总结。
演示网站:
gofly.sopans.com
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: