版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010918487/article/details/86146691
gin的日志是默认打印在控制台的,这样管理起来并不方便。你们会说自己打印到文件去啊?是的,我想要自己打印到指定的文件还想要实现日志按照日期拆分的功能,以前公司的日志拆分都是运维利用linux的logrotate来实现的日志拆分,比如每天凌晨拆分一次。https://www.cnblogs.com/zhutianshi/p/4012385.html
其实开发也可以实现这个功能的。
网上百度:日志拆分,你可看到logrus的很多信息。多余的我也就不重复了,这里直接上代码。
先附上参考的大佬文章:https://blog.csdn.net/lihao19910921/article/details/81534162
用gin的同学都知道,gin的日志默认是不会打印的,只会在控制台,我封装了一个中间件,每次gin的调用,都会打印出来。
我把日志打印到了指定的目录,并没有打印到当前目录下。
package handler
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/lestrrat-go/file-rotatelogs"
"github.com/rifflock/lfshook"
log "github.com/sirupsen/logrus"
"os"
"path"
"time"
)
func Logger() gin.HandlerFunc {
logClient := log.New()
var logPath = "/var/log/katy"// 日志打印到指定的目录
// 目录不存在则创建
//if !util.PathExists(logPath) {
// os.MkdirAll(logPath, os.ModePerm)
//}
fileName := path.Join(logPath, "gin-api.log")
//禁止logrus的输出
src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
if err!= nil{
fmt.Println("err", err)
}
// 设置日志输出的路径
logClient.Out = src
logClient.SetLevel(log.DebugLevel)
//apiLogPath := "gin-api.log"
logWriter, err := rotatelogs.New(
fileName+".%Y-%m-%d-%H-%M.log",
rotatelogs.WithLinkName(fileName), // 生成软链,指向最新日志文件
rotatelogs.WithMaxAge(7*24*time.Hour), // 文件最大保存时间
rotatelogs.WithRotationTime(24*time.Hour), // 日志切割时间间隔
)
writeMap := lfshook.WriterMap{
log.InfoLevel: logWriter,
log.FatalLevel: logWriter,
log.DebugLevel: logWriter, // 为不同级别设置不同的输出目的
log.WarnLevel: logWriter,
log.ErrorLevel: logWriter,
log.PanicLevel: logWriter,
}
lfHook := lfshook.NewHook(writeMap, &log.JSONFormatter{})
logClient.AddHook(lfHook)
return func (c *gin.Context) {
// 开始时间
start := time.Now()
// 处理请求
c.Next()
// 结束时间
end := time.Now()
//执行时间
latency := end.Sub(start)
path := c.Request.URL.Path
clientIP := c.ClientIP()
method := c.Request.Method
statusCode := c.Writer.Status()
// 这里是指定日志打印出来的格式。分别是状态码,执行时间,请求ip,请求方法,请求路由(等下我会截图)
logClient.Infof("| %3d | %13v | %15s | %s %s |",
statusCode,
latency,
clientIP,
method, path,
)
}
}
再看下我的路由里面是怎么写的。
package route
import (
"config/handler"// 说明一下,我这里的这个项目名即是config
"github.com/gin-gonic/gin"
)
func GetHttpRouter() *gin.Engine {
router := gin.Default()
// 日志打印
router.Use(handler.Logger())
user := router.Group("/api/v1/user")
{
// add user
user.POST("/add", handler.AddUserHandler)
}
return router
}
来看下我的/var/log/katy目录下的信息:
来具体看下里面的内容(我之前说过我会截图的)
由于我已经执行过好几次了,所以你可以看到这里有好几条记录。
你看下从msg以后,是不是按照代码的格式来列出来的,依次是:状态码,执行时间,请求ip,请求方法,请求路由
希望对你有帮助