golang中常見的logrus日志庫
戰(zhàn)術(shù)臥倒
golang中常見的日志包是logrus, 根據(jù)logrus的胚子和我們的生產(chǎn)要求,給出一個(gè)生產(chǎn)可用的logrus實(shí)踐姿勢。
主謂賓定狀補(bǔ)
logrus是一個(gè)結(jié)構(gòu)化的、可插拔的、兼容golang標(biāo)準(zhǔn)log api的日志庫。
快速過一下能力
- 支持對output=TTY增加關(guān)鍵字顏色
- 內(nèi)置JSONFormatter和TextFormatter(默認(rèn))兩種Formatter
- 支持輸出logger所在的函數(shù)行位置
log.SetReportCaller(true) - 可以兼容golang內(nèi)置的標(biāo)準(zhǔn)log庫, 建議無腦替換
- 鼓勵(lì)輸出可解析的日志字段,而不是大段的無法結(jié)構(gòu)化的文本日志
log.WithFields(log.Fields{
"event": event,
"topic": topic,
"key": key,
}).Fatal("Failed to send event")基于現(xiàn)狀,湊了6個(gè)錢包上生產(chǎn),下面給出一些自己的生產(chǎn)實(shí)踐。
添磚加瓦
1. logrus不支持滾動(dòng)日志
好馬配好鞍 https://github.com/lestrrat-go/file-rotatelogs 讓你下雨天不再哭泣。
它會(huì)根據(jù)配置自動(dòng)按照時(shí)間切分日志,并滾動(dòng)清理日志(不用配磁盤報(bào)警,不用擔(dān)心磁盤滿故障)。
logf, err := rotatelogs.New(
cfg.Log.LogDir+logName+".%Y%m%d%H%M",
rotatelogs.WithLinkName(cfg.Log.LogDir+logName),
rotatelogs.WithMaxAge(24*time.Hour),
rotatelogs.WithRotationTime(time.Hour),
)
if err != nil {
stdLog.Printf("failed to create rotatelogs: %s", err)
return
}2. 日志格式化
java生態(tài)默認(rèn)日志輸出格式:
11:44:44.827 WARN [93ef3E0120160803114444] [main] [ClassPathXmlApplicationContext] Exception encountered during context initialization - cancelling refresh attempt
在公司中javaer占據(jù)主流,故java的默認(rèn)格式就成了公司集中式日志的"標(biāo)準(zhǔn)"格式。
很明顯,logrus默認(rèn)的兩種Formatter都不匹配。
github.com/antonfisher/nested-logrus-formatter 讓你柳暗花明。
log.SetFormatter(&nested.Formatter{ // 嵌套日志兼容skynet日志格式
HideKeys: true,
FieldsOrder: []string{"region", "node", "topic"},
TimestampFormat: "2006-01-02 15:04:05.000", // 顯示ms
})3. 自定義Hook用法:輸出默認(rèn)字段
寫本文的時(shí)候,發(fā)現(xiàn)logrus官方本身支持輸出默認(rèn)日志字段。
requestLogger := log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip}) requestLogger.Warn("something not great happened")
Hook: 通常 鉤子函數(shù)用于在觸發(fā)某種事件時(shí)附帶一些動(dòng)作。
logrus的Hook定義:logEntry滿足指定的logLevel日志時(shí), 你想要做的動(dòng)作(你甚至可以不設(shè)置output直接在hook輸出日志, 這就是內(nèi)置write hook的實(shí)現(xiàn))。
type Hook interface {
Levels() []Level
Fire(*Entry) error
}示例代碼為logLevel>=info的logEntry,固定了2個(gè)日志字段。
type FixedFieldHook struct {
LogLevels []logrus.Level
FixedField map[string]string
}
// Fire will be called when some logging function is called with current hook
// It will format log entry to string and write it to appropriate writer
func (hook *FixedFieldHook) Fire(entry *logrus.Entry) error {
for k, v := range hook.FixedField {
entry.Data[k] = v
}
return nil
}
log.AddHook(&FixedFieldHook{ // Set fixed field
FixedField: map[string]string{"region": cfg.LocalRegion, "node": ip},
LogLevels: []logrus.Level{
logrus.InfoLevel,
logrus.ErrorLevel,
logrus.WarnLevel,
logrus.FatalLevel,
},
})
拋磚引玉,戰(zhàn)術(shù)臥倒。
到此這篇關(guān)于golang中常見的logrus日志庫的文章就介紹到這了,更多相關(guān)golang中l(wèi)ogrus日志庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文詳解Golang中net/http包的實(shí)現(xiàn)原理
這篇文章主要介紹了如何用?net/http?自己編寫實(shí)現(xiàn)一個(gè)?HTTP?Server?并探究其實(shí)現(xiàn)原理,具體講解Go語言是如何接收和處理請求的,希望能夠?qū)Υ蠹业膶W(xué)習(xí)或工作具有一定的幫助2022-08-08
golang實(shí)現(xiàn)http服務(wù)器處理靜態(tài)文件示例
這篇文章主要介紹了golang實(shí)現(xiàn)http服務(wù)器處理靜態(tài)文件的方法,涉及Go語言基于http協(xié)議處理文件的相關(guān)技巧,需要的朋友可以參考下2016-07-07
Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù)
HTTP協(xié)議是基于TCP/IP協(xié)議棧的,并且它也是一個(gè)面向普通文本的協(xié)議。這篇文章主要詳細(xì)介紹了Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù),感興趣的小伙伴可以借鑒一下2023-04-04
golang?gorm學(xué)習(xí)之如何指定數(shù)據(jù)表
在sql中首先要指定是從哪張表中查詢,所以這篇文章小編就來帶大家一起看一下gorm是如何根據(jù)model來自動(dòng)解析表名的,感興趣的小伙伴可以了解下2023-08-08
Go中信號量的5種經(jīng)典實(shí)現(xiàn)方式
本文主要介紹了Go中信號量的5種經(jīng)典實(shí)現(xiàn)方式,可以解決高并發(fā)資源控制難題,涵蓋互斥鎖、通道、第三方庫等實(shí)現(xiàn)方式,適用于限流、協(xié)程池等場景,感興趣的可以了解一下2026-05-05
使用go語言實(shí)現(xiàn)查找兩個(gè)數(shù)組的異同操作
這篇文章主要介紹了使用go語言實(shí)現(xiàn)查找兩個(gè)數(shù)組的異同操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12

