gin中集成logrus,做日志记录、分隔

logrus库

logrus库的介绍和使用请看这篇:golang日志框架之logrus

gin中集成logrus

  1. 初始化日志器和日志实例
package util

import (
    "fmt"
    rotatelogs "github.com/lestrrat-go/file-rotatelogs"
    "github.com/rifflock/lfshook"
    "github.com/sirupsen/logrus"
    "os"
    "time"
)

var (
	Logger = logrus.New()  // 初始化日志对象
	LogEntry *logrus.Entry
)


func init() {
    // 写入日志文件
    logPath := "logs/log"  // 日志存放路径
    linkName := "logs/latest.log"  // 最新日志的软连接路径
    src, err := os.OpenFile(logPath, os.O_RDWR|os.O_CREATE, 0755)  // 初始化日志文件对象
    if err != nil {
        fmt.Println("err: ", err)
    }
    //log := logrus.New()  // 初始化日志对象
    Logger.Out = src  // 把产生的日志内容写进日志文件中

    // 日志分隔:1. 每天产生的日志写在不同的文件;2. 只保留一定时间的日志(例如:一星期)
    Logger.SetLevel(logrus.DebugLevel)  // 设置日志级别
    logWriter, _ := rotatelogs.New(
        logPath + "%Y%m%d.log",  // 日志文件名格式
        rotatelogs.WithMaxAge(7 * 24 * time.Hour),  // 最多保留7天之内的日志
        rotatelogs.WithRotationTime(24*time.Hour),  // 一天保存一个日志文件
        rotatelogs.WithLinkName(linkName),  // 为最新日志建立软连接
    )
    writeMap := lfshook.WriterMap{
        logrus.InfoLevel: logWriter,  // info级别使用logWriter写日志
        logrus.FatalLevel: logWriter,
        logrus.DebugLevel: logWriter,
        logrus.ErrorLevel: logWriter,
        logrus.PanicLevel: logWriter,
    }
    Hook := lfshook.NewHook(writeMap, &logrus.TextFormatter{
        TimestampFormat: "2006-01-02 15:04:05",  // 格式日志时间
    })
    Logger.AddHook(Hook)
    LogEntry = logrus.NewEntry(Logger).WithField("service", "yi-shou-backstage")
}
  1. 在项目中使用定义的日志实例记录日志
// user列表
func ListUsers(ctx *gin.Context){
    util.LogEntry.Error("用户列表")
    ctx.JSON(200, gin.H{
        "message": "hello go",
    })
}
  1. 定义日志中间件,记录常见异常的日志信息
package middleware

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "github.com/sirupsen/logrus"
    "math"
    "time"
    "yi-shou-backstage/util"
)

func LoggerMiddleware() gin.HandlerFunc{
    return func(c *gin.Context) {
        startTime := time.Now()
        c.Next()  // 调用该请求的剩余处理程序
        stopTime := time.Since(startTime)
        spendTime := fmt.Sprintf("%d ms", int(math.Ceil(float64(stopTime.Nanoseconds() / 1000000))))
        //hostName, err := os.Hostname()
        //if err != nil {
        //    hostName = "Unknown"
        //}
        statusCode := c.Writer.Status()
        //clientIP := c.ClientIP()
        //userAgent := c.Request.UserAgent()
        dataSize := c.Writer.Size()
        if dataSize < 0 {
            dataSize = 0
        }
        method := c.Request.Method
        url := c.Request.RequestURI
        Log := util.Logger.WithFields(logrus.Fields{
            //"HostName": hostName,
            "SpendTime": spendTime,
            "path": url,
            "Method": method,
            "status": statusCode,
            //"Ip": clientIP,
            //"DataSize": dataSize,
            //"UserAgent": userAgent,
        })
        if len(c.Errors) > 0 {  // 矿建内部错误
            Log.Error(c.Errors.ByType(gin.ErrorTypePrivate))
        }
        if statusCode >= 500 {
            Log.Error()
        } else if statusCode >= 400 {
            Log.Warn()
        }else {
            Log.Info()
        }
    }
}
  1. gin集成自定义的中间件
router := gin.New()
// 注册自定义的日志器
router.Use(middleware.LoggerMiddleware())
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值