golang logrus日志框架實(shí)例詳解
logrus簡(jiǎn)介
logrus是一個(gè)可插拔的、結(jié)構(gòu)化的日志框架。
logrus擁有六種日志級(jí)別:debug、info、warn、error、fatal和panic
可擴(kuò)展的Hook機(jī)制:
允許使用者通過(guò)hook的方式將日志分發(fā)到任意地方,如本地文件系統(tǒng)、標(biāo)準(zhǔn)輸出、logstash、elasticsearch或者mq等,或者通過(guò)hook定義日志內(nèi)容和格式等。
logrus內(nèi)置了兩種日志格式,JSONFormatter和TextFormatter,如果這兩個(gè)格式不滿(mǎn)足需求,可以自己動(dòng)手實(shí)現(xiàn)接口Formatter,來(lái)定義自己的日志格式。
logrus鼓勵(lì)通過(guò)Field機(jī)制進(jìn)行精細(xì)化的、結(jié)構(gòu)化的日志記錄,而不是通過(guò)冗長(zhǎng)的消息來(lái)記錄日志。
寫(xiě)一個(gè)簡(jiǎn)單的例子
package main import ( log "github.com/sirupsen/logrus" ) func main() { log.WithFields(log.Fields{ "animal": "walrus", }).Info("A walrus appears") }
高級(jí)用法
logger是一種相對(duì)高級(jí)的用法, 對(duì)于一個(gè)大型項(xiàng)目, 往往需要一個(gè)全局的logrus實(shí)例,即logger對(duì)象來(lái)記錄項(xiàng)目所有的日志。
一些默認(rèn)的初始化
package main import ( log "github.com/sirupsen/logrus" ) func main() { var log = logrus.New() // 設(shè)置日志級(jí)別為xx以及以上 log.SetLevel(logrus.InfoLevel) //JSON在生產(chǎn)中通常只在使用Splunk或Logstash等工具進(jìn)行日志聚合時(shí)才有用。 // 設(shè)置日志格式為json格式 // log.SetFormatter(&logrus.JSONFormatter{ // // PrettyPrint: true,//格式化json // TimestampFormat: "2006-01-02 15:04:05",//時(shí)間格式化 // }) log.SetFormatter(&logrus.TextFormatter{ TimestampFormat: "2006-01-02 15:04:05",//時(shí)間格式化 }) // 設(shè)置將日志輸出到標(biāo)準(zhǔn)輸出(默認(rèn)的輸出為stderr,標(biāo)準(zhǔn)錯(cuò)誤) // 日志消息輸出可以是任意的io.writer類(lèi)型 log.SetOutput(os.Stdout) // 初始化一些公共參數(shù) loginit:=log.WithFields(logrus.Fields{ "animal": "walrus", }) //輸出日志 log.Info("A walrus appears") }
在日志中打印文件行號(hào)等信息
log.SetReportCaller(true)可以打印行號(hào)
package main import ( "github.com/sirupsen/logrus" "os" "runtime" "time" ) func main() { // logger是一種相對(duì)高級(jí)的用法, 對(duì)于一個(gè)大型項(xiàng)目, 往往需要一個(gè)全局的logrus實(shí)例,即logger對(duì)象來(lái)記錄項(xiàng)目所有的日志。 var log = logrus.New() log.SetReportCaller(true) // 顯示行號(hào)等信息 // 設(shè)置日志級(jí)別為xx以及以上 log.SetLevel(logrus.InfoLevel) log.SetFormatter(&logrus.TextFormatter{ TimestampFormat: "2006-01-02 15:04:05",//時(shí)間格式化 }) // 設(shè)置將日志輸出到標(biāo)準(zhǔn)輸出(默認(rèn)的輸出為stderr,標(biāo)準(zhǔn)錯(cuò)誤) // 日志消息輸出可以是任意的io.writer類(lèi)型 log.SetOutput(os.Stdout) // 初始化一些公共參數(shù) loginit:=log.WithFields(logrus.Fields{ "animal": "walrus", }) log.Info("A walrus appears") }
golang logrus日志框架
logrus自定義log 日志
廢話(huà)不多說(shuō),直接舉個(gè)栗子
package main import ( "fmt" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "net/http" "os" ) var log=logrus.New()//創(chuàng)建一個(gè)log實(shí)例 func initLogrus()error{ log.Formatter=&logrus.JSONFormatter{}//設(shè)置為json格式的日志 file,err:=os.OpenFile("./gin_log.log",os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644)//創(chuàng)建一個(gè)log日志文件 if err!=nil{ fmt.Println("創(chuàng)建文件/打開(kāi)文件失?。?) return err } log.Out=file//設(shè)置log的默認(rèn)文件輸出 gin.SetMode(gin.ReleaseMode)//發(fā)布版本 gin.DefaultWriter=log.Out//gin框架自己記錄的日志也會(huì)輸出 log.Level=logrus.InfoLevel//設(shè)置文件級(jí)別 return nil } func main() { err:=initLogrus() if err!=nil{ fmt.Println(err) return } r := gin.Default() r.GET("/logrus", func(c *gin.Context) { //定義寫(xiě)入log日志的信息 log.WithFields(logrus.Fields{ "url":c.Request.RequestURI, "method":c.Request.Method, "params":c.Query("name"), "IP":c.ClientIP(), }).Info() resData:= struct { Code int `json:"code"` Msg string `json:"msg"` Data interface{} `json:"data"` }{http.StatusOK,"響應(yīng)成功","OK"} c.JSON(http.StatusOK,resData) }) r.Run(":9090") } # 碼完直接go run 某go 文件。如果沒(méi)安裝import那些依賴(lài)。直接go mod tidy;
上效果
logrus設(shè)置最大保存時(shí)間、設(shè)置日志切割時(shí)間間隔等
package main import ( "fmt" "github.com/gin-gonic/gin" rotatelogs "github.com/lestrrat-go/file-rotatelogs" "github.com/rifflock/lfshook" "github.com/sirupsen/logrus" "net/http" "os" "path" "time" ) var ( logFilePath="./"http://文件存儲(chǔ)路徑 logFileName="system.log" ) func main() { r := gin.Default() //添加中間件,主要實(shí)現(xiàn)log日志的生成 r.Use(logMiddleware()) r.GET("/logrus2", func(c *gin.Context) { c.JSON(http.StatusOK,gin.H{ "code":200, "msg":"響應(yīng)成功", "data":"ok", }) }) r.Run(":9090") } func logMiddleware() gin.HandlerFunc{ //日志文件 fileName := path.Join(logFilePath, logFileName) file,err:=os.OpenFile(fileName,os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644)//創(chuàng)建一個(gè)log日志文件 if err!=nil{ fmt.Println(err) } //實(shí)例化 logger:=logrus.New() //設(shè)置日志級(jí)別 logger.SetLevel(logrus.DebugLevel) logger.Out=file//設(shè)置log的默認(rèn)文件輸出 logWriter,err:=rotatelogs.New( //分割后的文件名稱(chēng) fileName+".%Y%m%d.log", //生成軟鏈接,指向最新日志文件 rotatelogs.WithLinkName(fileName), //設(shè)置最大保存時(shí)間7天 rotatelogs.WithMaxAge(7*24*time.Hour), //設(shè)置日志切割時(shí)間間隔(1天) rotatelogs.WithRotationTime(1*time.Hour), ) //hook機(jī)制的設(shè)置 writerMap:=lfshook.WriterMap{ logrus.InfoLevel: logWriter, logrus.FatalLevel: logWriter, logrus.DebugLevel: logWriter, logrus.WarnLevel: logWriter, logrus.ErrorLevel: logWriter, logrus.PanicLevel: logWriter, } //給logrus添加hook logger.AddHook(lfshook.NewHook(writerMap,&logrus.JSONFormatter{ TimestampFormat: "2006-01-02 15:04:05", })) return func(c *gin.Context) { c.Next() //請(qǐng)求方法 method:=c.Request.Method //請(qǐng)求路由 reqUrl:=c.Request.RequestURI //狀態(tài)碼 statusCode:=c.Writer.Status() //請(qǐng)求ip clientIp:=c.ClientIP() logger.WithFields(logrus.Fields{ "status_code":statusCode, "client_ip":clientIp, "req_method":method, "req_url":reqUrl, }).Info() } }
到此這篇關(guān)于golang logrus日志框架的文章就介紹到這了,更多相關(guān)golang logrus日志框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang實(shí)現(xiàn)數(shù)組分割的示例代碼
本文主要介紹了golang實(shí)現(xiàn)數(shù)組分割的示例代碼,要求把數(shù)組分割成多個(gè)正整數(shù)大小的數(shù)組,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12go語(yǔ)言版的ip2long函數(shù)實(shí)例
這篇文章主要介紹了go語(yǔ)言版的ip2long函數(shù),實(shí)例分析了Go語(yǔ)言實(shí)現(xiàn)的ip2long函數(shù)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02Golang內(nèi)存泄漏詳解之原因、檢測(cè)與修復(fù)過(guò)程
本文詳細(xì)介紹了Golang中的內(nèi)存泄漏問(wèn)題,包括內(nèi)存泄漏的定義、分類(lèi)、影響以及預(yù)防和修復(fù)方法,通過(guò)使用Golang自帶的性能分析工具和火焰圖工具,可以有效地檢測(cè)和定位內(nèi)存泄漏的代碼路徑,合理的代碼設(shè)計(jì)和定期的代碼審查也是預(yù)防內(nèi)存泄漏的關(guān)鍵2024-12-12golang使用http client發(fā)起get和post請(qǐng)求示例
這篇文章主要介紹了golang使用http client發(fā)起get和post請(qǐng)求示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02使用go備份StarRocks建表語(yǔ)句方法實(shí)例
這篇文章主要為大家介紹了使用go備份StarRocks建表語(yǔ)句方法實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12golang?使用sort.slice包實(shí)現(xiàn)對(duì)象list排序
這篇文章主要介紹了golang?使用sort.slice包實(shí)現(xiàn)對(duì)象list排序,對(duì)比sort跟slice兩種排序的使用方式區(qū)別展開(kāi)內(nèi)容,需要的小伙伴可以參考一下2022-03-03golang實(shí)現(xiàn)單點(diǎn)登錄系統(tǒng)(go-sso)
這篇文章主要介紹了golang實(shí)現(xiàn)單點(diǎn)登錄系統(tǒng)(go-sso),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06