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基礎上調(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ù)Encoder,WriteSyncer,LogLevelEncoder:編譯器,通俗說就是輸出日志是什么格式,json or 終端格式。
json格式就使用NewJSONEncoder(),并使用預先設置的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)化
//設置日志編譯器,什么類型的日志
func getEncoder() zapcore.Encoder{
//encoder配置
encoderConfig := zap.NewProductionEncoderConfig()
//設置時間格式為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進行日志切割歸檔
//設置輸出位置
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()
}
//設置日志編譯器,什么類型的日志
func getEncoder() zapcore.Encoder{
//encoder配置
encoderConfig := zap.NewProductionEncoderConfig()
//設置時間格式為2024-9-1-12.32
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
//json格式
// jsonencoder := zapcore.NewJSONEncoder(encoderConfig)
//終端形式
ConsoleEncoder := zapcore.NewConsoleEncoder(encoderConfig)
return ConsoleEncoder
}
//設置輸出位置
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-09
Go語言中?Print?Printf和Println?的區(qū)別解析
這篇文章主要介紹了Go語言中?Print?Printf和Println?的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03

