智能在线客服系统源码GOFLY开发日志- 4. gin框架增加日志中间件

2022-02-22 19:41:45 浏览数 (2)

项目里面的 web 框架是 gin,这个框架给我的感觉就是非常的小巧实用。使用的时候,基础运用非常的简单,相信看看文档大家都能运行起来,没什么可说的。如果现在需求是增加一个日志中间件,记录下 http 请求的一些数据,并且需要按日期来生成每天的日志文件,我是这么做的。

使用的日志库是 github.com/sirupsen/logrus

我新建了一个 lib 包,里面专门放对第三方库的一些封装,比如我这个日志库

这个里面,使用了一下单例模式,不用每次都生成 logrus 结构实体。但是还需要每次都检测下每天的日志文件是否存在,所以专门加个函数处理,每天生成的日志文件,设置好 logrus 的输出对象

代码语言:javascript复制
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

代码语言:javascript复制
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("| = | v | s | %s | %s |",
            statusCode,
            latencyTime,
            clientIP,
            reqMethod,
            reqUri,
        )
    }
}

最后就是在 use 一下上面的中间件就可以了

代码语言:javascript复制
engine := gin.Default()
logger := lib.NewLogger(common.LogDirPath)
engine.Use(middleware.NewMidLogger(logger))

后面还遇到了哪些问题和知识点将会继续进行总结。

演示网站: gofly.sopans.com

0 人点赞