go日志庫logrus的安裝及快速使用
安裝簡介
Logrus是Go的結(jié)構(gòu)化日志記錄器,與標準的日志記錄器庫完全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會導(dǎo)致goroutine直接退出。
支持的日志級別
logrus支持多種日志級別,下面從小到大:
- Panic:記錄日志,然后panic
- Fatal:致命錯誤,輸出日志后,程序退出
- Error:錯誤
- Warn:警告
- Info:關(guān)鍵信息
- Debug:調(diào)試信息
- 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
打印調(diào)用位置
在進行定位的時候需要知道是那行代碼調(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
添加字段
定位問題需要知道具體是那個數(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
給字段值加引號
配置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è)置鉤子
每條日志在輸出前都會執(zhí)行鉤子的特定方法,相當于全局攔截,可以方便做一些擴展,比如添加字段channel表明日志是那個應(yīng)用輸出的、增加tranceid方便對問題的跟蹤、輸出日志文件等。
設(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自己寫入文件,但是指定單個文件收集的時間范圍、保存的時間logrus并不支持,筆者目前的項目使用的是file-rotatelogs,但是作者已經(jīng)不更新和維護,所以這里就不使用它來展示,有在考慮使用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從獲得日志內(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)閉控制臺打印
log.SetOutput(ioutil.Discard)
log.Info("test log write file")
}
很顯然這只是個例子,不可直接應(yīng)用于生產(chǎn)。
以上就是go日志庫logrus的安裝及快速使用的詳細內(nèi)容,更多關(guān)于go日志庫logrus安裝使用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang使用反射的動態(tài)方法調(diào)用詳解
Go是一種靜態(tài)類型的語言,提供了大量的安全性和性能。這篇文章主要和大家介紹一下Golang使用反射的動態(tài)方法調(diào)用,感興趣的小伙伴可以了解一下2023-03-03
利用Go語言快速實現(xiàn)一個極簡任務(wù)調(diào)度系統(tǒng)
任務(wù)調(diào)度(Task Scheduling)是很多軟件系統(tǒng)中的重要組成部分,字面上的意思是按照一定要求分配運行一些通常時間較長的腳本或程序。本文將利用Go語言快速實現(xiàn)一個極簡任務(wù)調(diào)度系統(tǒng),感興趣的可以了解一下2022-10-10
Windows+Linux系統(tǒng)下Go語言環(huán)境安裝配置過程
Go 語言被設(shè)計成一門應(yīng)用于搭載 Web 服務(wù)器,存儲集群或類似用途的巨型中央服務(wù)器的系統(tǒng)編程語言。這篇文章主要介紹了Windows+Linux系統(tǒng)下Go語言環(huán)境搭建配置過程,針對每種系統(tǒng)給大家講解的非常詳細,需要的朋友可以參考下2021-06-06
golang 實現(xiàn)一個restful微服務(wù)的操作
這篇文章主要介紹了golang 實現(xiàn)一個restful微服務(wù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

