Go日志管理庫zap安裝及使用過程
一、zap介紹
在許多Go語言項目中,我們需要一個好的日志記錄器能夠提供下面這些功能:
1.能夠?qū)⑹录涗浀轿募?,而不是應用程序控制臺。
2.日志切割-能夠根據(jù)文件大小、時間或間隔等來切割日志文件。
3.支持不同的日志級別。例如INFO,DEBUG,ERROR等。
4.能夠打印基本信息,如調(diào)用文件/函數(shù)名和行號,日志時間等。
二、安裝及使用
2.1 安裝
go get -u go.uber.org/zap
2.2 配置logger日志記錄器
Zap提供了兩種類型的日志記錄器—Sugared Logger和Logger,一般使用Logger 。
2.2.1 初始化Logger
func InitLogger() *zap.Logger{ logger ,_ := zap.NewProduction() return logger }
2.2.2 初始化SugaredLogger
//在Logger基礎(chǔ)上調(diào)用logger.Suger() func InitLogger() *zap.SugaredLogger{ logger ,_ := zap.NewProduction() return logger.Sugar() }
而初始化logger調(diào)用的函數(shù)可以通過調(diào)用zap.NewProduction()/zap.NewDevelopment()
或者zap.Example()
創(chuàng)建一個Logger。區(qū)別就是一個是以json的格式返回,一個是以終端標準輸出帶有空格返回。
NewProducts()
NewDevelopment()
2.3 使用logger進行日志記錄
使用logger的自帶的方法進行日志記錄,logger.info(),logger.error().logger.debug等等
這些方法的語法都是
func (log *Logger) MethodXXX(msg string, fields ...Field) 例如: logger.info( "msg", zap.String("msg",v), zap.Error(err), )
完整代碼
package main import ( "net/http" "go.uber.org/zap" ) var Logger *zap.SugaredLogger func main() { //初始化zap日志記錄器 Logger = InitLogger() defer Logger.Sync() //模擬義務 Simplefunc("http://www.baidu.com") Simplefunc("www.google.com") } func InitLogger() *zap.SugaredLogger{ logger ,_ := zap.NewDevelopment() return logger.Sugar() } func Simplefunc(url string) { res,err:=http.Get(url) if err!=nil { //記錄錯誤日志 Logger.Error( "http get failed..", zap.String("url:",url), zap.Error(err), ) }else { //使用info記錄成功日志。 Logger.Info( "get success", zap.String("status:",res.Status), zap.String("url:",url), ) res.Body.Close() } }
2.4 自定義logger記錄器
2.4.1 將日志寫入文件而不是終端上述的官方提供的logger生成功能不是那么強大,項目需要將日志記錄到文件和分割 的時候就需要自定義。
zap自定義logger生成器使用zap.New():func New(core zapcore.Core, options ...Option) *Logger
其中zapcore.Core需要設(shè)置三個參數(shù)Encoder,WriteSyncer,LogLevelEncoder:編譯器,通俗說就是輸出日志是什么格式,json or 終端格式。
json格式就使用NewJSONEncoder(),并使用預先設(shè)置的ProductionEncoderConfig(): zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()) 終端格式就使用NewConsoleEncoder(): zapcore.NewConsoleEncoder(zap.NewProductionEncoderConfig())
WriteSyncer:將日志輸出到哪。使用zapcore.AddSync()函數(shù)并且將打開的文件句柄傳進去。
file, _ := os.Create("./test.log") writeSyncer := zapcore.AddSync(file)
LogLevel:將什么樣級別的日志輸出.
代碼實例:
//使用自定義的zap logger func InitLogger() *zap.SugaredLogger{ //日志文件 logfile, _ :=os.OpenFile("zap_log.log",os.O_APPEND | os.O_CREATE|os.O_RDWR,0666) //編碼器 encoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()) //輸出位置 writeSyncer := zapcore.AddSync(logfile) //定義core core := zapcore.NewCore( encoder, writeSyncer, zapcore.DebugLevel, ) //創(chuàng)建logger logger:= zap.New(core) return logger.Sugar() }
2.4.2 若輸出到文件和終端,只需要更改WriteSyncer參數(shù)
//使用自定義的zap logger func InitLogger() *zap.SugaredLogger{ //日志文件 logfile, _ :=os.OpenFile("zap_log.log",os.O_APPEND | os.O_CREATE|os.O_RDWR,0666) //編碼器 encoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()) //輸出位置 // writeSyncer := zapcore.AddSync(logfile) //輸出多個位置 wc := io.MultiWriter(logfile,os.Stdout) writeSyncer:= zapcore.AddSync(wc) //定義core core := zapcore.NewCore( encoder, writeSyncer, zapcore.DebugLevel, ) //創(chuàng)建logger logger:= zap.New(core) return logger.Sugar() }
效果:
2.4.3 將輸出的時間轉(zhuǎn)化
//設(shè)置日志編譯器,什么類型的日志 func getEncoder() zapcore.Encoder{ //encoder配置 encoderConfig := zap.NewProductionEncoderConfig() //設(shè)置時間格式為2024-9-1-12.32 encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder //json格式 // jsonencoder := zapcore.NewJSONEncoder(encoderConfig) //終端形式 ConsoleEncoder := zapcore.NewConsoleEncoder(encoderConfig) return ConsoleEncoder }
2.4.4 記錄不同級別的日志有時候日志可分為log.erro.log 記錄錯誤級別日志,;log.success.log記錄成功級別日志,zapcore.DebugLevel就全記錄。
core1 := zapcore.NewCore( encoder, writeSyncer, zapcore.DebugLevel,//全記錄 ) //錯誤日志 core2 := zapcore.NewCore( encoder, getwriteSyncer("log.err.log"), zapcore.ErrorLevel, ) c:=zapcore.NewTee(core1,core2) logger:= zap.New(c,zap.AddCaller()) return logger.Sugar()
2.4.5 AddCaller詳細記錄調(diào)用的代碼行,AddCallerSkip(1)調(diào)用鏈很多時直接跳過
logger:= zap.New(core,zap.AddCaller(), zap.AddCallerSkip(1))
3. 記錄全日志,錯誤日志文件,同步終端,標準時間,記錄代碼位置的自定義logger代碼
點擊查看代碼
[========]
[========]
4.使用Lumberjack進行日志切割歸檔
//設(shè)置輸出位置 func getwriteSyncer(logfilename string) zapcore.WriteSyncer { //日志文件 // logfile, _ :=os.OpenFile(logfilename,os.O_APPEND | os.O_CREATE|os.O_RDWR,0666) //分割日志 l, _ := rotatelogs.New( logfilename+".%Y%m%d%H%M.log", rotatelogs.WithMaxAge(30*24*time.Hour), // 最長保存30天 rotatelogs.WithRotationTime(time.Hour*24), // 24小時切割一次 ) //也輸出到終端 wc := io.MultiWriter(l,os.Stdout) return zapcore.AddSync(wc) }
5.上述完整代碼
//使用自定義的zap logger func InitLogger() *zap.SugaredLogger{ //編碼器 encoder := getEncoder() //輸出位置 writeSyncer:= getwriteSyncer("log_all.log") //定義core core1 := zapcore.NewCore( encoder, writeSyncer, zapcore.DebugLevel,//全記錄 ) //錯誤日志 core2 := zapcore.NewCore( encoder, getwriteSyncer("log.err.log"), zapcore.ErrorLevel, ) //創(chuàng)建單個logger // logger:= zap.New(core1,zap.AddCaller(), zap.AddCallerSkip(1)) //AddCaller詳細記錄調(diào)用的代碼行,AddCallerSkip(1)調(diào)用鏈很多時直接跳過 // return logger.Sugar() //創(chuàng)建雙日志,全日志和錯誤日志 c:=zapcore.NewTee(core1,core2) logger:= zap.New(c,zap.AddCaller()) return logger.Sugar() } //設(shè)置日志編譯器,什么類型的日志 func getEncoder() zapcore.Encoder{ //encoder配置 encoderConfig := zap.NewProductionEncoderConfig() //設(shè)置時間格式為2024-9-1-12.32 encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder //json格式 // jsonencoder := zapcore.NewJSONEncoder(encoderConfig) //終端形式 ConsoleEncoder := zapcore.NewConsoleEncoder(encoderConfig) return ConsoleEncoder } //設(shè)置輸出位置 func getwriteSyncer(logfilename string) zapcore.WriteSyncer { //日志文件 logfile, _ :=os.OpenFile(logfilename,os.O_APPEND | os.O_CREATE|os.O_RDWR,0666) //只輸出到日志文件 // return zapcore.AddSync(logfile) //也輸出到終端 wc := io.MultiWriter(logfile,os.Stdout) return zapcore.AddSync(wc) }
在gin框架中使用zap日志記錄器
到此這篇關(guān)于Go日志管理庫zap的文章就介紹到這了,更多相關(guān)Go日志管理庫zap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang中unicode碼和中文的互相轉(zhuǎn)換函數(shù)使用
這篇文章主要為大家介紹了Golang中unicode碼和中文的互相轉(zhuǎn)換函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09Go語言中?Print?Printf和Println?的區(qū)別解析
這篇文章主要介紹了Go語言中?Print?Printf和Println?的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03