<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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支援多種紀錄檔級別,下面從小到大:
可以看到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的安裝及快速使用的詳細內容,更多關於go紀錄檔庫logrus安裝使用的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45