Gin添加基于logrus的日志组件
作者:互联网
概述
在Web应用中,日志是非常重要的一部分数据,通过日志我们可以把控每天的请求情况和应用运行情况,还能够大大方便我们定位和追踪问题,所以非常有必要在开发时为Gin框架加入日志组件
设计
logrus是Go语言一款非常流行的日志库,其中封装了非常多方便易用的方法,所以我们也基于这个库来进行实现。
需要实现的功能有:
- 作为Gin的中间件记录每一次请求的信息,包括请求时间,运行时间,请求的Uri等
- 封装一个记录日志的方法,可在其他模块中调用,用于记录业务相关的日志
实现
直接上代码
第一步:封装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