gin日誌列印到某個目錄,並實現拆分
阿新 • • 發佈:2019-01-11
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,請求方法,請求路由
希望對你有幫助