go日志庫(kù)logrus的安裝及快速使用
安裝簡(jiǎn)介
Logrus是Go的結(jié)構(gòu)化日志記錄器,與標(biāo)準(zhǔn)的日志記錄器庫(kù)完全API兼容。
go get安裝的logrus庫(kù)
go get github.com/sirupsen/logrus
快速使用
package main import ( log "github.com/sirupsen/logrus" ) func main() { log.SetLevel(log.TraceLevel) log.Trace("trace") log.Debug("debug") log.Info("info") log.Warn("warn") log.Error("error") log.Fatal("fatal") log.Panic("panic") }
輸出:
TRAC[0000] trace
DEBU[0000] debug
INFO[0000] info
WARN[0000] warn
ERRO[0000] error
FATA[0000] fatal
exit status 1
可以看到panic沒(méi)有輸出,因?yàn)閒atal會(huì)導(dǎo)致goroutine直接退出。
支持的日志級(jí)別
logrus支持多種日志級(jí)別,下面從小到大:
- Panic:記錄日志,然后panic
- Fatal:致命錯(cuò)誤,輸出日志后,程序退出
- Error:錯(cuò)誤
- Warn:警告
- Info:關(guān)鍵信息
- Debug:調(diào)試信息
- Trace:很細(xì)粒度的信息,一般用不到。
可以看到Trace級(jí)別最大,Panic最小。默認(rèn)的級(jí)別為Info,高于這個(gè)級(jí)別的日志不會(huì)輸出。
日期
可以看到上面的日志沒(méi)有時(shí)間,可以指定日志格式:
package main import ( log "github.com/sirupsen/logrus" ) func main() { log.SetLevel(log.TraceLevel) log.SetFormatter(&log.TextFormatter{ FullTimestamp: true, TimestampFormat: "2022-07-17 00:00:00.000", }) log.Trace("trace") log.Debug("debug") log.Info("info") log.Warn("warn") log.Error("error") log.Fatal("fatal") log.Panic("panic") }
精確到毫秒。
輸出:
TRAC[171717+08-77 00:00:00.628] trace
DEBU[171717+08-77 00:00:00.629] debug
INFO[171717+08-77 00:00:00.629] info
WARN[171717+08-77 00:00:00.629] warn
ERRO[171717+08-77 00:00:00.629] error
FATA[171717+08-77 00:00:00.629] fatal
exit status 1
打印調(diào)用位置
在進(jìn)行定位的時(shí)候需要知道是那行代碼調(diào)用的log.SetReportCaller(true)
:
package main import ( log "github.com/sirupsen/logrus" ) func main() { log.SetLevel(log.TraceLevel) log.SetReportCaller(true) log.SetFormatter(&log.TextFormatter{ FullTimestamp: true, TimestampFormat: "2022-07-17 00:00:00.000", }) log.Trace("trace") log.Debug("debug") log.Info("info") log.Warn("warn") log.Error("error") log.Fatal("fatal") log.Panic("panic") }
輸出:
TRAC[171717+08-77 00:00:00.019]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:14 main.main() trace
DEBU[171717+08-77 00:00:00.019]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:15 main.main() debug
INFO[171717+08-77 00:00:00.019]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:16 main.main() info
WARN[171717+08-77 00:00:00.019]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:17 main.main() warn
ERRO[171717+08-77 00:00:00.019]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:18 main.main() error
FATA[171717+08-77 00:00:00.019]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:19 main.main() fatal
exit status 1
添加字段
定位問(wèn)題需要知道具體是那個(gè)數(shù)據(jù)調(diào)用的,可以借助于log.WithField
和log.WithFields
,log.WithField
內(nèi)部調(diào)用的也是log.WithFields
,參數(shù)底層使用map[string]interface{}數(shù)據(jù)結(jié)構(gòu)保存:
package main import ( log "github.com/sirupsen/logrus" "os" ) func main() { log.SetLevel(log.TraceLevel) log.SetReportCaller(true) log.SetFormatter(&log.TextFormatter{ FullTimestamp: true, TimestampFormat: "2022-07-17 00:00:00.000", }) id := os.Args[1] mylog := log.WithField("id", id) mylog.Trace("trace") mylog.Debug("debug") mylog.Info("info") mylog.Warn("warn") mylog.Error("error") mylog.Fatal("fatal") mylog.Panic("panic") }
輸出:
? StudyProject go run src/log/my_log.go 123
TRAC[171717+08-77 00:00:00.665]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:22 main.main() trace id=123
DEBU[171717+08-77 00:00:00.665]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:23 main.main() debug id=123
INFO[171717+08-77 00:00:00.665]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:24 main.main() info id=123
WARN[171717+08-77 00:00:00.665]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:25 main.main() warn id=123
ERRO[171717+08-77 00:00:00.665]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:26 main.main() error id=123
FATA[171717+08-77 00:00:00.665]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:27 main.main() fatal id=123
exit status 1
給字段值加引號(hào)
配置ForceQuote
為true
package main import ( log "github.com/sirupsen/logrus" "os" ) func main() { log.SetLevel(log.TraceLevel) log.SetReportCaller(true) log.SetFormatter(&log.TextFormatter{ FullTimestamp: true, TimestampFormat: "2022-07-17 00:00:00.000", ForceQuote: true, }) id := os.Args[1] mylog := log.WithField("id", id) mylog.Trace("trace") mylog.Debug("debug") mylog.Info("info") mylog.Warn("warn") mylog.Error("error") mylog.Fatal("fatal") mylog.Panic("panic") }
輸出:
? StudyProject go run src/log/my_log.go 123
TRAC[171717+08-77 00:00:00.427]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:22 main.main() trace id="123"
DEBU[171717+08-77 00:00:00.427]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:23 main.main() debug id="123"
INFO[171717+08-77 00:00:00.427]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:24 main.main() info id="123"
WARN[171717+08-77 00:00:00.427]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:25 main.main() warn id="123"
ERRO[171717+08-77 00:00:00.427]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:26 main.main() error id="123"
FATA[171717+08-77 00:00:00.427]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:27 main.main() fatal id="123"
exit status 1
設(shè)置鉤子
每條日志在輸出前都會(huì)執(zhí)行鉤子的特定方法,相當(dāng)于全局?jǐn)r截,可以方便做一些擴(kuò)展,比如添加字段channel表明日志是那個(gè)應(yīng)用輸出的、增加tranceid方便對(duì)問(wèn)題的跟蹤、輸出日志文件等。
設(shè)置channel
package hooks import log "github.com/sirupsen/logrus" type ChannelHook struct { ChannelName string } func (h ChannelHook) Levels() []log.Level { return log.AllLevels } func (h ChannelHook) Fire(entry *log.Entry) error { entry.Data["channel"] = h.ChannelName return nil }
package main import ( logs "StudyProject/src/log/hooks" log "github.com/sirupsen/logrus" ) func main() { log.AddHook(logs.ChannelHook{ ChannelName: "web", }) log.Info("info") }
輸出:
INFO[0000] info channel=web
輸出日志
可以利用logrus的hook自己寫(xiě)入文件,但是指定單個(gè)文件收集的時(shí)間范圍、保存的時(shí)間logrus并不支持,筆者目前的項(xiàng)目使用的是file-rotatelogs,但是作者已經(jīng)不更新和維護(hù),所以這里就不使用它來(lái)展示,有在考慮使用goframe的glog替換。
筆者這里就寫(xiě)個(gè)簡(jiǎn)單例子演示如何利用logrus的hook去寫(xiě)文件并且把控制臺(tái)的打印干掉:
package hooks import ( log "github.com/sirupsen/logrus" "io/ioutil" ) // //FileHook // @Description: 文件hook // type FileHook struct { // // FileName // @Description: 文件名 // FileName string } func (h FileHook) Levels() []log.Level { return log.AllLevels } func (h FileHook) Fire(entry *log.Entry) error { fomat := &log.TextFormatter{ FullTimestamp: true, TimestampFormat: "2022-07-17 00:00:00.000", } // 從entry從獲得日志內(nèi)容 msg, err := fomat.Format(entry) if err != nil { return err } err = ioutil.WriteFile(h.FileName, msg, 0644) if err != nil { return err } return nil }
package main import ( logs "StudyProject/src/log/hooks" log "github.com/sirupsen/logrus" "io/ioutil" ) func main() { log.AddHook(logs.FileHook{"log"}) // 關(guān)閉控制臺(tái)打印 log.SetOutput(ioutil.Discard) log.Info("test log write file") }
很顯然這只是個(gè)例子,不可直接應(yīng)用于生產(chǎn)。
以上就是go日志庫(kù)logrus的安裝及快速使用的詳細(xì)內(nèi)容,更多關(guān)于go日志庫(kù)logrus安裝使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談Golang?Slice切片如何擴(kuò)容的實(shí)現(xiàn)
本文主要介紹了淺談Golang?Slice切片如何擴(kuò)容的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Golang使用反射的動(dòng)態(tài)方法調(diào)用詳解
Go是一種靜態(tài)類型的語(yǔ)言,提供了大量的安全性和性能。這篇文章主要和大家介紹一下Golang使用反射的動(dòng)態(tài)方法調(diào)用,感興趣的小伙伴可以了解一下2023-03-03Go操作mongodb數(shù)據(jù)庫(kù)方法示例
這篇文章主要為大家介紹了Go操作mongodb數(shù)據(jù)庫(kù)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Go語(yǔ)言常見(jiàn)設(shè)計(jì)模式之裝飾模式詳解
在?Go?語(yǔ)言中,雖然裝飾模式?jīng)]有像?Python?中應(yīng)用那么廣泛,但也有其用武之地,這篇文章我們就來(lái)一起看下裝飾模式在?Go?語(yǔ)言中的應(yīng)用吧2023-07-07利用Go語(yǔ)言快速實(shí)現(xiàn)一個(gè)極簡(jiǎn)任務(wù)調(diào)度系統(tǒng)
任務(wù)調(diào)度(Task Scheduling)是很多軟件系統(tǒng)中的重要組成部分,字面上的意思是按照一定要求分配運(yùn)行一些通常時(shí)間較長(zhǎng)的腳本或程序。本文將利用Go語(yǔ)言快速實(shí)現(xiàn)一個(gè)極簡(jiǎn)任務(wù)調(diào)度系統(tǒng),感興趣的可以了解一下2022-10-10Windows+Linux系統(tǒng)下Go語(yǔ)言環(huán)境安裝配置過(guò)程
Go 語(yǔ)言被設(shè)計(jì)成一門(mén)應(yīng)用于搭載 Web 服務(wù)器,存儲(chǔ)集群或類似用途的巨型中央服務(wù)器的系統(tǒng)編程語(yǔ)言。這篇文章主要介紹了Windows+Linux系統(tǒng)下Go語(yǔ)言環(huán)境搭建配置過(guò)程,針對(duì)每種系統(tǒng)給大家講解的非常詳細(xì),需要的朋友可以參考下2021-06-06golang 實(shí)現(xiàn)一個(gè)restful微服務(wù)的操作
這篇文章主要介紹了golang 實(shí)現(xiàn)一個(gè)restful微服務(wù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04