1. 程式人生 > >gin日誌列印到某個目錄,並實現拆分

gin日誌列印到某個目錄,並實現拆分

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

 

希望對你有幫助