最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go日志管理庫zap安裝及使用過程

 更新時間:2024年09月13日 08:55:38   作者:云島夜川川  
Zap是Go語言中一個高性能的日志記錄庫,它支持日志切割、多級別日志記錄等功能,zap還支持使用Lumberjack進(jìn)行日志文件的自動切割和歸檔,適用于需要高效日志管理的Go項(xiàng)目開發(fā),本文介紹Go日志管理庫zap安裝及使用過程,感興趣的朋友一起看看吧

一、zap介紹

在許多Go語言項(xiàng)目中,我們需要一個好的日志記錄器能夠提供下面這些功能:

1.能夠?qū)⑹录涗浀轿募?,而不是?yīng)用程序控制臺。
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的格式返回,一個是以終端標(biāo)準(zhǔn)輸出帶有空格返回。
NewProducts()

image

NewDevelopment()

image

2.3 使用logger進(jìn)行日志記錄

使用logger的自帶的方法進(jìn)行日志記錄,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()
	//模擬義務(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 {
		//記錄錯誤日志
		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生成功能不是那么強(qiáng)大,項(xiàng)目需要將日志記錄到文件和分割 的時候就需要自定義。
zap自定義logger生成器使用zap.New():
func New(core zapcore.Core, options ...Option) *Logger其中zapcore.Core需要設(shè)置三個參數(shù)Encoder,WriteSyncer,LogLevelEncoder:編譯器,通俗說就是輸出日志是什么格式,json or 終端格式。

json格式就使用NewJSONEncoder(),并使用預(yù)先設(shè)置的ProductionEncoderConfig():
zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
終端格式就使用NewConsoleEncoder():
zapcore.NewConsoleEncoder(zap.NewProductionEncoderConfig())

WriteSyncer:將日志輸出到哪。使用zapcore.AddSync()函數(shù)并且將打開的文件句柄傳進(jìn)去。

file, _ := os.Create("./test.log")
writeSyncer := zapcore.AddSync(file)

LogLevel:將什么樣級別的日志輸出.

代碼實(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)
	//輸出多個位置
	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詳細(xì)記錄調(diào)用的代碼行,AddCallerSkip(1)調(diào)用鏈很多時直接跳過

logger:= zap.New(core,zap.AddCaller(), zap.AddCallerSkip(1))

image

3. 記錄全日志,錯誤日志文件,同步終端,標(biāo)準(zhǔn)時間,記錄代碼位置的自定義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),    // 最長保存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詳細(xì)記錄調(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中json和struct的使用說明

    golang中json和struct的使用說明

    這篇文章主要介紹了golang中json和struct的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • golang 如何獲取pem格式RSA公私鑰長度

    golang 如何獲取pem格式RSA公私鑰長度

    這篇文章主要介紹了golang 如何獲取pem格式RSA公私鑰長度操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang中的包及包管理工具go?mod詳解

    Golang中的包及包管理工具go?mod詳解

    這篇文章主要介紹了Golang中的包及包管理工具go?mod,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • GoLang RabbitMQ TTL與死信隊(duì)列以及延遲隊(duì)列詳細(xì)講解

    GoLang RabbitMQ TTL與死信隊(duì)列以及延遲隊(duì)列詳細(xì)講解

    這篇文章主要介紹了GoLang RabbitMQ TTL與死信隊(duì)列以及延遲隊(duì)列,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • go sync Once實(shí)現(xiàn)原理示例解析

    go sync Once實(shí)現(xiàn)原理示例解析

    這篇文章主要為大家介紹了go sync Once實(shí)現(xiàn)原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 使用Go語言編寫、注冊并管理一個Linux系統(tǒng)服務(wù)

    使用Go語言編寫、注冊并管理一個Linux系統(tǒng)服務(wù)

    在生產(chǎn)環(huán)境中,我們經(jīng)常需要讓服務(wù)在后臺長期運(yùn)行,例如監(jiān)控程序、日志收集器、任務(wù)調(diào)度器或 Web 服務(wù), 這些后臺常駐的進(jìn)程被稱為系統(tǒng)服務(wù)或守護(hù)進(jìn)程,本文將通過一個實(shí)戰(zhàn)案例,講解如何使用 Go 編寫、注冊并管理一個 Linux 系統(tǒng)服務(wù),需要的朋友可以參考下
    2025-10-10
  • 詳解Golang中Context的原理和使用技巧

    詳解Golang中Context的原理和使用技巧

    Golang?的?Context?包,中文可以稱之為“上下文”,是用來在?goroutine?協(xié)程之間進(jìn)行上下文信息傳遞的,這些上下文信息包括?kv?數(shù)據(jù)、取消信號、超時時間、截止時間等。本文主要介紹了Context的原理和使用技巧,希望對大家有所幫助
    2022-11-11
  • golang實(shí)現(xiàn)簡單rpc調(diào)用過程解析

    golang實(shí)現(xiàn)簡單rpc調(diào)用過程解析

    這篇文章主要介紹了golang實(shí)現(xiàn)簡單rpc調(diào)用,包括RPC具體實(shí)現(xiàn)結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • Go源碼字符串規(guī)范檢查lint工具strchecker使用詳解

    Go源碼字符串規(guī)范檢查lint工具strchecker使用詳解

    這篇文章主要為大家介紹了Go源碼字符串規(guī)范檢查lint工具strchecker使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go 內(nèi)存分配管理

    Go 內(nèi)存分配管理

    這篇文章主要介紹了Go 內(nèi)存分配管理,go 語言實(shí)際內(nèi)存、虛擬內(nèi)存怎么分配,延遲歸還是什么機(jī)制?本文結(jié)合監(jiān)控對內(nèi)存管理進(jìn)行了觀測,深入學(xué)習(xí)golang對于內(nèi)存的管理機(jī)制,需要的朋友可以參考一下
    2022-02-02

最新評論

木里| 德江县| 漳浦县| 同心县| 临西县| 淮安市| 汽车| 临西县| 理塘县| 福海县| 监利县| 濉溪县| 阆中市| 乳源| 泾阳县| 缙云县| 恭城| 馆陶县| 永福县| 凌海市| 东至县| 繁峙县| 清原| 栾城县| 安图县| 交城县| 伊宁县| 台中市| 海丰县| 博客| 陕西省| 和静县| 樟树市| 北辰区| 北京市| 南投市| 浦城县| 商南县| 诸暨市| 分宜县| 萝北县|