logrus库
logrus库的介绍和使用请看这篇:golang日志框架之logrus
gin中集成logrus
- 初始化日志器和日志实例
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")
}
- 在项目中使用定义的日志实例记录日志
// user列表
func ListUsers(ctx *gin.Context){
util.LogEntry.Error("用户列表")
ctx.JSON(200, gin.H{
"message": "hello go",
})
}
- 定义日志中间件,记录常见异常的日志信息
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()
}
}
}
- gin集成自定义的中间件
router := gin.New()
// 注册自定义的日志器
router.Use(middleware.LoggerMiddleware())