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自己寫入文件,但是指定單個(gè)文件收集的時(shí)間范圍、保存的時(shí)間logrus并不支持,筆者目前的項(xiàng)目使用的是file-rotatelogs,但是作者已經(jīng)不更新和維護(hù),所以這里就不使用它來(lái)展示,有在考慮使用goframe的glog替換。
筆者這里就寫個(gè)簡(jiǎn)單例子演示如何利用logrus的hook去寫文件并且把控制臺(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)文章
Go?gRPC服務(wù)進(jìn)階middleware使用教程
這篇文章主要為大家介紹了Go?gRPC服務(wù)進(jìn)階middleware的使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Go語(yǔ)言擴(kuò)展原語(yǔ)之Semaphore的用法詳解
Go語(yǔ)言的擴(kuò)展包中提供了帶權(quán)重的信號(hào)量?semaphore.Weighted,讓我們可以按照不同的權(quán)重管理資源的訪問(wèn),下面小編就來(lái)和大家聊聊它們的具體用法吧2023-07-07
go語(yǔ)言之給定英語(yǔ)文章統(tǒng)計(jì)單詞數(shù)量(go語(yǔ)言小練習(xí))
這篇文章給大家分享go語(yǔ)言小練習(xí)給定英語(yǔ)文章統(tǒng)計(jì)單詞數(shù)量,實(shí)現(xiàn)思路大概是利用go語(yǔ)言的map類型,以每個(gè)單詞作為關(guān)鍵字存儲(chǔ)數(shù)量信息,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2020-01-01
Go語(yǔ)言中循環(huán)語(yǔ)句使用的示例詳解
在不少實(shí)際問(wèn)題中有許多具有規(guī)律性的重復(fù)操作,因此在程序中就需要重復(fù)執(zhí)行某些語(yǔ)句。本文將通過(guò)示例詳細(xì)為大家講講Go語(yǔ)言中的循環(huán)語(yǔ)句,需要的可以參考一下2022-04-04
詳解Golang中使用map時(shí)的注意問(wèn)題
Golang中的map是一種數(shù)據(jù)結(jié)構(gòu),它允許你使用鍵值對(duì)的形式存儲(chǔ)和訪問(wèn)數(shù)據(jù),map在Go中是非排序的,提供了高效查找、插入和刪除元素的能力,特別是當(dāng)鍵是不可變類型,本文給大家詳細(xì)介紹了Golang中使用map時(shí)的注意問(wèn)題,需要的朋友可以參考下2024-06-06
Go利用反射reflect實(shí)現(xiàn)獲取接口變量信息
反射是通過(guò)實(shí)體對(duì)象獲取反射對(duì)象(Value、Type),然后可以操作相應(yīng)的方法。本文將利用Go語(yǔ)言中的反射reflect實(shí)現(xiàn)獲取接口變量信息,需要的可以參考一下2022-05-05
go語(yǔ)言使用pipe讀取子進(jìn)程標(biāo)準(zhǔn)輸出的方法
這篇文章主要介紹了go語(yǔ)言使用pipe讀取子進(jìn)程標(biāo)準(zhǔn)輸出的方法,實(shí)例分析了Go語(yǔ)言針對(duì)進(jìn)程操作的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03

