golang zaplog使用(轉(zhuǎn))

zap 使用

uber 開源昆庇,zap 可以在控制面板、文檔甚至發(fā)送數(shù)據(jù)到其他系統(tǒng)中闸溃,以此來記錄日志整吆。我們可以指定日志的級別,支持 json 結(jié)構(gòu)化辉川,方便查詢表蝙。

和 logrus 類似,簡單來講乓旗,日志有兩個概念:字段和消息府蛇。字段用來結(jié)構(gòu)化輸出錯誤相關(guān)的上下文環(huán)境,而消息簡明扼要的闡述錯誤本身寸齐。

開發(fā)模式下是普通文本的結(jié)構(gòu):

package main

import (
 "go.uber.org/zap"
 "time"
)

func () {

 logger, _ := zap.NewDevelopment() 

 defer logger.Sync()
 logger.Info("無法獲取網(wǎng)址",
 zap.String("url", "http://www.baidu.com"),
 zap.Int("attempt", 3),
 zap.Duration("backoff", time.Second),
 )
}

|

自定義配置:

func main() {
 encoderConfig := zapcore.EncoderConfig{
 TimeKey:        "time",
 LevelKey:       "level",
 NameKey:        "logger",
 CallerKey:      "caller",
 MessageKey:     "msg",
 StacktraceKey:  "stacktrace",
 LineEnding:     zapcore.DefaultLineEnding,
 EncodeLevel:    zapcore.LowercaseLevelEncoder, 
 EncodeTime:     zapcore.ISO8601TimeEncoder,     // ISO8601 UTC 時間格式
 EncodeDuration: zapcore.SecondsDurationEncoder,
 EncodeCaller:   zapcore.FullCallerEncoder,      // 全路徑編碼器
 }

 // 設(shè)置日志級別
 atom := zap.NewAtomicLevelAt(zap.DebugLevel)

 config := zap.Config{
 Level:            atom,                                                // 日志級別
 Development:      true,                                                // 開發(fā)模式欲诺,堆棧跟蹤
 Encoding:         "json",                                              // 輸出格式 console 或 json
 EncoderConfig:    encoderConfig,                                       // 編碼器配置
 InitialFields:    map[string]interface{}{"serviceName": "spikeProxy"}, // 初始化字段,如:添加一個服務(wù)器名稱
 OutputPaths:      []string{"stdout", "./logs/spikeProxy.log"},         // 輸出到指定文檔 stdout(標準輸出渺鹦,正常顏色) stderr(錯誤輸出,紅色)
 ErrorOutputPaths: []string{"stderr"},
 }

 // 構(gòu)建日志
 logger, err := config.Build()
 if err != nil {
 panic(fmt.Sprintf("log 初始化失敗: %v", err))
 }
 logger.Info("log 初始化成功")

 logger.Info("無法獲取網(wǎng)址",
 zap.String("url", "http://www.baidu.com"),
 zap.Int("attempt", 3),
 zap.Duration("backoff", time.Second),
 )
}

lumberjack 歸檔

日志文檔越來越大蛹含,我們根據(jù)大小毅厚、日期進行歸檔。
zap 可以寫入文檔浦箱,但是并沒有歸檔的功能吸耿。借助于 lumberjack 第三方庫,利用 hook 進行歸檔酷窥。

import (
 "go.uber.org/zap"
 "go.uber.org/zap/zapcore"
 "time"
 "gopkg.in/natefinch/lumberjack.v2"
 "os"
)

func main() {
 hook := lumberjack.Logger{
 Filename:   "./logs/spikeProxy1.log", // 日志文檔路徑
 MaxSize:    128,                      // 每個日志文檔保存的最大尺寸 單位:M
 MaxBackups: 30,                       // 日志文檔最多保存多少個備份
 MaxAge:     7,                        // 文檔最多保存多少天
 Compress:   true,                     // 是否壓縮
 }

 encoderConfig := zapcore.EncoderConfig{
 TimeKey:        "time",
 LevelKey:       "level",
 NameKey:        "logger",
 CallerKey:      "linenum",
 MessageKey:     "msg",
 StacktraceKey:  "stacktrace",
 LineEnding:     zapcore.DefaultLineEnding,
 EncodeLevel:    zapcore.LowercaseLevelEncoder,  // 小寫編碼器
 EncodeTime:     zapcore.ISO8601TimeEncoder,     // ISO8601 UTC 時間格式
 EncodeDuration: zapcore.SecondsDurationEncoder, //
 EncodeCaller:   zapcore.FullCallerEncoder,      // 全路徑編碼器
 EncodeName:     zapcore.FullNameEncoder,
 }

 // 設(shè)置日志級別
 atomicLevel := zap.NewAtomicLevel()
 atomicLevel.SetLevel(zap.InfoLevel)

 core := zapcore.NewCore(
 zapcore.NewJSONEncoder(encoderConfig),                                           // 編碼器配置
 zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&hook)), // 打印到控制面板和文檔
 atomicLevel,                                                                     // 日志級別
 )

 // 開啟開發(fā)模式咽安,堆棧跟蹤
 caller := zap.AddCaller()
 // 開啟文檔及行號
 development := zap.Development()
 // 設(shè)置初始化字段
 filed := zap.Fields(zap.String("serviceName", "serviceName"))
 // 構(gòu)造日志
 logger := zap.New(core, caller, development, filed)

 logger.Info("log 初始化成功")
 logger.Info("無法獲取網(wǎng)址",
 zap.String("url", "[http://www.baidu.com](http://www.baidu.com/)"),
 zap.Int("attempt", 3),
 zap.Duration("backoff", time.Second))
}

zap 優(yōu)勢及原理

標準 log 沒有日志分級。seelog 可分級蓬推,支持歸檔妆棒,比較靈活,但是利用反射沸伏,效率低糕珊。

避免 GC: 對象復(fù)用

zap 通過 sync.Pool 提供的對象池,復(fù)用了大量可以復(fù)用的對象毅糟,避開了 gc 這個大麻煩红选。

內(nèi)建的 Encoder: 避免反射

標準庫中的 json.Marshaler 提供的是基于類型反射的拼接方式,代價是高昂的姆另。

zap 選擇了自己實現(xiàn) json Encoder喇肋。 通過明確的類型調(diào)用坟乾,直接拼接字符串,最小化性能開銷蝶防。

level handler

level handler 是 zap 提供的一種 level 的處理方式糊渊,通過 http 請求動態(tài)改變?nèi)罩窘M件級別。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慧脱,一起剝皮案震驚了整個濱河市渺绒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌菱鸥,老刑警劉巖宗兼,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異氮采,居然都是意外死亡殷绍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門鹊漠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來主到,“玉大人,你說我怎么就攤上這事躯概∮ソ罚” “怎么了畏纲?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我戳吝,道長乌叶,這世上最難降的妖魔是什么否副? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任壹粟,我火速辦了婚禮,結(jié)果婚禮上呻此,老公的妹妹穿的比我還像新娘轮纫。我一直安慰自己,他們只是感情好焚鲜,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布掌唾。 她就那樣靜靜地躺著,像睡著了一般恃泪。 火紅的嫁衣襯著肌膚如雪郑兴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天贝乎,我揣著相機與錄音情连,去河邊找鬼。 笑死览效,一個胖子當(dāng)著我的面吹牛却舀,可吹牛的內(nèi)容都是我干的虫几。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼挽拔,長吁一口氣:“原來是場噩夢啊……” “哼辆脸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起螃诅,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤啡氢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后术裸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倘是,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年袭艺,在試婚紗的時候發(fā)現(xiàn)自己被綠了搀崭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡猾编,死狀恐怖瘤睹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情答倡,我是刑警寧澤轰传,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站苇羡,受9級特大地震影響绸吸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜设江,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攘轩。 院中可真熱鬧叉存,春花似錦、人聲如沸度帮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笨篷。三九已至瞳秽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間率翅,已是汗流浹背练俐。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冕臭,地道東北人腺晾。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓燕锥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悯蝉。 傳聞我的和親對象是個殘疾皇子归形,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344