Go日志管理庫(kù)zap安裝及使用過(guò)程
一、zap介紹
在許多Go語(yǔ)言項(xiàng)目中,我們需要一個(gè)好的日志記錄器能夠提供下面這些功能:
1.能夠?qū)⑹录涗浀轿募?,而不是?yīng)用程序控制臺(tái)。
2.日志切割-能夠根據(jù)文件大小、時(shí)間或間隔等來(lái)切割日志文件。
3.支持不同的日志級(jí)別。例如INFO,DEBUG,ERROR等。
4.能夠打印基本信息,如調(diào)用文件/函數(shù)名和行號(hào),日志時(shí)間等。
二、安裝及使用
2.1 安裝
go get -u go.uber.org/zap
2.2 配置logger日志記錄器
Zap提供了兩種類(lèi)型的日志記錄器—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ù)可以通過(guò)調(diào)用zap.NewProduction()/zap.NewDevelopment()或者zap.Example()創(chuàng)建一個(gè)Logger。區(qū)別就是一個(gè)是以json的格式返回,一個(gè)是以終端標(biāo)準(zhǔn)輸出帶有空格返回。
NewProducts()

NewDevelopment()

2.3 使用logger進(jìn)行日志記錄
使用logger的自帶的方法進(jìn)行日志記錄,logger.info(),logger.error().logger.debug等等
這些方法的語(yǔ)法都是
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()
//模擬義務(wù)
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 {
//記錄錯(cuò)誤日志
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 將日志寫(xiě)入文件而不是終端上述的官方提供的logger生成功能不是那么強(qiáng)大,項(xiàng)目需要將日志記錄到文件和分割 的時(shí)候就需要自定義。
zap自定義logger生成器使用zap.New():func New(core zapcore.Core, options ...Option) *Logger其中zapcore.Core需要設(shè)置三個(gè)參數(shù)Encoder,WriteSyncer,LogLevelEncoder:編譯器,通俗說(shuō)就是輸出日志是什么格式,json or 終端格式。
json格式就使用NewJSONEncoder(),并使用預(yù)先設(shè)置的ProductionEncoderConfig(): zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()) 終端格式就使用NewConsoleEncoder(): zapcore.NewConsoleEncoder(zap.NewProductionEncoderConfig())
WriteSyncer:將日志輸出到哪。使用zapcore.AddSync()函數(shù)并且將打開(kāi)的文件句柄傳進(jìn)去。
file, _ := os.Create("./test.log")
writeSyncer := zapcore.AddSync(file)LogLevel:將什么樣級(jí)別的日志輸出.
代碼實(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)
//定義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)
//輸出多個(gè)位置
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 將輸出的時(shí)間轉(zhuǎn)化
//設(shè)置日志編譯器,什么類(lèi)型的日志
func getEncoder() zapcore.Encoder{
//encoder配置
encoderConfig := zap.NewProductionEncoderConfig()
//設(shè)置時(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 記錄不同級(jí)別的日志有時(shí)候日志可分為log.erro.log 記錄錯(cuò)誤級(jí)別日志,;log.success.log記錄成功級(jí)別日志,zapcore.DebugLevel就全記錄。
core1 := zapcore.NewCore(
encoder,
writeSyncer,
zapcore.DebugLevel,//全記錄
)
//錯(cuò)誤日志
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詳細(xì)記錄調(diào)用的代碼行,AddCallerSkip(1)調(diào)用鏈很多時(shí)直接跳過(guò)
logger:= zap.New(core,zap.AddCaller(), zap.AddCallerSkip(1))

3. 記錄全日志,錯(cuò)誤日志文件,同步終端,標(biāo)準(zhǔn)時(shí)間,記錄代碼位置的自定義logger代碼
點(diǎn)擊查看代碼
[========]
[========]
4.使用Lumberjack進(jìn)行日志切割歸檔
//設(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), // 最長(zhǎng)保存30天
rotatelogs.WithRotationTime(time.Hour*24), // 24小時(shí)切割一次
)
//也輸出到終端
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,//全記錄
)
//錯(cuò)誤日志
core2 := zapcore.NewCore(
encoder,
getwriteSyncer("log.err.log"),
zapcore.ErrorLevel,
)
//創(chuàng)建單個(gè)logger
// logger:= zap.New(core1,zap.AddCaller(), zap.AddCallerSkip(1)) //AddCaller詳細(xì)記錄調(diào)用的代碼行,AddCallerSkip(1)調(diào)用鏈很多時(shí)直接跳過(guò)
// return logger.Sugar()
//創(chuàng)建雙日志,全日志和錯(cuò)誤日志
c:=zapcore.NewTee(core1,core2)
logger:= zap.New(c,zap.AddCaller())
return logger.Sugar()
}
//設(shè)置日志編譯器,什么類(lèi)型的日志
func getEncoder() zapcore.Encoder{
//encoder配置
encoderConfig := zap.NewProductionEncoderConfig()
//設(shè)置時(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日志管理庫(kù)zap的文章就介紹到這了,更多相關(guān)Go日志管理庫(kù)zap內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)AES對(duì)稱(chēng)加密算法實(shí)例詳解
所謂對(duì)稱(chēng)加密是指在加密和解碼時(shí)使用同一密鑰的加密方式,下面這篇文章主要給大家介紹了關(guān)于Golang實(shí)現(xiàn)AES對(duì)稱(chēng)加密算法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
Golang實(shí)現(xiàn)簡(jiǎn)易的命令行功能
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Golang實(shí)現(xiàn)一個(gè)簡(jiǎn)易的命令行功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下2023-02-02
Go語(yǔ)言時(shí)間相關(guān)操作合集(超詳細(xì))
在開(kāi)發(fā)應(yīng)用程序的過(guò)程中,經(jīng)常需要記錄某些操作的時(shí)間或者格式化時(shí)間戳,因此大部分編程語(yǔ)言都會(huì)有操作時(shí)間的庫(kù),Go語(yǔ)言當(dāng)然也不例外,本文我們就一起來(lái)學(xué)習(xí)一下time包的使用2023-08-08
Golang中unicode碼和中文的互相轉(zhuǎn)換函數(shù)使用
這篇文章主要為大家介紹了Golang中unicode碼和中文的互相轉(zhuǎn)換函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Golang設(shè)計(jì)模式之原型模式詳細(xì)講解
如果一個(gè)類(lèi)的有非常多的屬性,層級(jí)還很深。每次構(gòu)造起來(lái),不管是直接構(gòu)造還是用建造者模式,都要對(duì)太多屬性進(jìn)行復(fù)制,那么有沒(méi)有一種好的方式讓我們創(chuàng)建太的時(shí)候使用體驗(yàn)更好一點(diǎn)呢? 今天的文章里就給大家介紹一種設(shè)計(jì)模式,來(lái)解決這個(gè)問(wèn)題2023-01-01
Go語(yǔ)言中?Print?Printf和Println?的區(qū)別解析
這篇文章主要介紹了Go語(yǔ)言中?Print?Printf和Println?的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03

