gin日志打印到某个目录,并实现拆分

88 篇文章 0 订阅

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,请求方法,请求路由

 

希望对你有帮助

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值