其他分享
首页 > 其他分享> > Gin添加基于logrus的日志组件

Gin添加基于logrus的日志组件

作者:互联网

概述

在Web应用中,日志是非常重要的一部分数据,通过日志我们可以把控每天的请求情况和应用运行情况,还能够大大方便我们定位和追踪问题,所以非常有必要在开发时为Gin框架加入日志组件

设计

logrus是Go语言一款非常流行的日志库,其中封装了非常多方便易用的方法,所以我们也基于这个库来进行实现。

需要实现的功能有:

实现

直接上代码
第一步:封装logger组件

package logger

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"os"
	"time"
)

var AppLog *logrus.Logger
var WebLog *logrus.Logger

func Setup() {
	initAppLog()
	initWebLog()
}

/**
	初始化AppLog
 */
func initAppLog() {
	logFileName := "app.log"
	AppLog = initLog(logFileName)
}

/**
	初始化WebLog
*/
func initWebLog() {
	logFileName := "web.log"
	WebLog = initLog(logFileName)
}

/**
	初始化日志句柄
 */
func initLog(logFileName string) *logrus.Logger{
	log := logrus.New()
	log.Formatter = &logrus.JSONFormatter{
		TimestampFormat: "2006-01-02 15:04:05",
	}
	logPath := "logs/"
	logName := logPath + logFileName
	var f *os.File
	var err error
	//判断日志文件是否存在,不存在则创建,否则就直接打开
	if _, err := os.Stat(logName); os.IsNotExist(err) {
		f, err = os.Create(logName)
	} else {
		f, err = os.OpenFile(logName,os.O_APPEND|os.O_WRONLY, os.ModeAppend)
	}

	if err != nil {
		fmt.Println("open log file failed")
	}

	log.Out = f
	log.Level = logrus.InfoLevel
	return log
}

/**
	Gin中间件函数,记录请求日志
 */
func LoggerToFile() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 开始时间
		startTime := time.Now()

		// 处理请求
		c.Next()

		// 结束时间
		endTime := time.Now()

		// 执行时间
		latencyTime := fmt.Sprintf("%6v",endTime.Sub(startTime))

		// 请求方式
		reqMethod := c.Request.Method

		// 请求路由
		reqUri := c.Request.RequestURI

		// 状态码
		statusCode := c.Writer.Status()

		// 请求IP
		clientIP := c.ClientIP()

		//日志格式
		WebLog.WithFields(logrus.Fields{
			"http_status": statusCode,
			"total_time" : latencyTime,
			"ip" : clientIP,
			"method" : reqMethod,
			"uri" : reqUri,
		}).Info("access")
	}
}

第二步:在路由中添加中间件

    r :=gin.New()
	r.Use(logger.LoggerToFile())

或者是这样的代码,看你如何使用路由

r:= gin.Default() //
r.Use(logger.LoggerToFile())

这样当有请求的时候,就会在logs/web.log下面记录一条这样的日志

{"http_status":200,"ip":"10.18.73.47","level":"info","method":"POST","msg":"access","time":"2020-11-24 18:58:11","total_time":"295.302717ms","uri":"/api/xxx?aaa=1"}

第三步:在业务中记录日志
例如在某个报错后记录异常日志

exist, err := redis.Bool(conn.Do("exists", key))
	if err != nil {
		logger.AppLog.WithFields(logrus.Fields{
			"key": key,
		}).Errorf("key exists execute redis cmd fail [%v]",err)
		return false
	}

这样会记录一条这样的日志

{"key":"test_key","msg":"key exists execute redis cmd fail [redis gone away]","record_cnt":15,"time":"2020-11-24 18:58:11"}

标签:log,err,logrus,key,Gin,日志,os
来源: https://blog.csdn.net/u011897301/article/details/110194095