您好,登錄后才能下訂單哦!
這篇文章主要介紹“go日志庫logrus如何安裝及使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“go日志庫logrus如何安裝及使用”文章能幫助大家解決問題。
Logrus是Go的結構化日志記錄器,與標準的日志記錄器庫完全API兼容。
go get安裝的logrus庫
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沒有輸出,因為fatal會導致goroutine直接退出。
logrus支持多種日志級別,下面從小到大:
Panic:記錄日志,然后panic
Fatal:致命錯誤,輸出日志后,程序退出
Error:錯誤
Warn:警告
Info:關鍵信息
Debug:調試信息
Trace:很細粒度的信息,一般用不到。
可以看到Trace級別最大,Panic最小。默認的級別為Info,高于這個級別的日志不會輸出。
可以看到上面的日志沒有時間,可以指定日志格式:
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
在進行定位的時候需要知道是那行代碼調用的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
定位問題需要知道具體是那個數據調用的,可以借助于log.WithField
和log.WithFields
,log.WithField
內部調用的也是log.WithFields
,參數底層使用map[string]interface{}數據結構保存:
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
配置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
每條日志在輸出前都會執行鉤子的特定方法,相當于全局攔截,可以方便做一些擴展,比如添加字段channel表明日志是那個應用輸出的、增加tranceid方便對問題的跟蹤、輸出日志文件等。
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自己寫入文件,但是指定單個文件收集的時間范圍、保存的時間logrus并不支持,筆者目前的項目使用的是file-rotatelogs,但是作者已經不更新和維護,所以這里就不使用它來展示,有在考慮使用goframe的glog替換。
筆者這里就寫個簡單例子演示如何利用logrus的hook去寫文件并且把控制臺的打印干掉:
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從獲得日志內容 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"}) // 關閉控制臺打印 log.SetOutput(ioutil.Discard) log.Info("test log write file") }
關于“go日志庫logrus如何安裝及使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。