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
添加字段
定位問題需要知道具體是那個數(shù)據(jù)調用的,可以借助于log.WithField和log.WithFields,log.WithField內部調用的也是log.WithFields,參數(shù)底層使用map[string]interface{}數(shù)據(jù)結構保存:
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
設置鉤子
每條日志在輸出前都會執(zhí)行鉤子的特定方法,相當于全局攔截,可以方便做一些擴展,比如添加字段channel表明日志是那個應用輸出的、增加tranceid方便對問題的跟蹤、輸出日志文件等。
設置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,但是作者已經不更新和維護,所以這里就不使用它來展示,有在考慮使用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安裝使用的資料請關注腳本之家其它相關文章!
相關文章
go語言之給定英語文章統(tǒng)計單詞數(shù)量(go語言小練習)
這篇文章給大家分享go語言小練習給定英語文章統(tǒng)計單詞數(shù)量,實現(xiàn)思路大概是利用go語言的map類型,以每個單詞作為關鍵字存儲數(shù)量信息,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2020-01-01

