欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2024年09月13日 08:55:38   作者:云島夜川川  
Zap是Go語言中一個高性能的日志記錄庫,它支持日志切割、多級別日志記錄等功能,zap還支持使用Lumberjack進行日志文件的自動切割和歸檔,適用于需要高效日志管理的Go項目開發(fā),本文介紹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()

image

NewDevelopment()

image

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))

image

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實現(xiàn)AES對稱加密算法實例詳解

    Golang實現(xiàn)AES對稱加密算法實例詳解

    所謂對稱加密是指在加密和解碼時使用同一密鑰的加密方式,下面這篇文章主要給大家介紹了關(guān)于Golang實現(xiàn)AES對稱加密算法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • Golang實現(xiàn)簡易的命令行功能

    Golang實現(xiàn)簡易的命令行功能

    這篇文章主要為大家詳細介紹了如何通過Golang實現(xiàn)一個簡易的命令行功能,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的可以了解一下
    2023-02-02
  • go語言中GoMock安裝使用詳解

    go語言中GoMock安裝使用詳解

    這篇文章主要為大家介紹了go語言中GoMock安裝使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 深入理解 Go 語言中的 Context

    深入理解 Go 語言中的 Context

    這篇文章主要介紹了 理解 Go 語言中的 Context,需要的朋友可以參考下
    2020-06-06
  • Go語言時間相關(guān)操作合集(超詳細)

    Go語言時間相關(guān)操作合集(超詳細)

    在開發(fā)應用程序的過程中,經(jīng)常需要記錄某些操作的時間或者格式化時間戳,因此大部分編程語言都會有操作時間的庫,Go語言當然也不例外,本文我們就一起來學習一下time包的使用
    2023-08-08
  • Golang中unicode碼和中文的互相轉(zhuǎn)換函數(shù)使用

    Golang中unicode碼和中文的互相轉(zhuǎn)換函數(shù)使用

    這篇文章主要為大家介紹了Golang中unicode碼和中文的互相轉(zhuǎn)換函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Golang設(shè)計模式之原型模式詳細講解

    Golang設(shè)計模式之原型模式詳細講解

    如果一個類的有非常多的屬性,層級還很深。每次構(gòu)造起來,不管是直接構(gòu)造還是用建造者模式,都要對太多屬性進行復制,那么有沒有一種好的方式讓我們創(chuàng)建太的時候使用體驗更好一點呢? 今天的文章里就給大家介紹一種設(shè)計模式,來解決這個問題
    2023-01-01
  • Go語言中?Print?Printf和Println?的區(qū)別解析

    Go語言中?Print?Printf和Println?的區(qū)別解析

    這篇文章主要介紹了Go語言中?Print?Printf和Println?的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • GO語言中err接口及defer延遲異常處理分析

    GO語言中err接口及defer延遲異常處理分析

    這篇文章主要為大家介紹了GO語言中err接口及defer延遲異常處理的示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Golang反射修改變量值的操作代碼

    Golang反射修改變量值的操作代碼

    這篇文章主要介紹了Golang反射修改變量值,也就是Golang反射三大定律中的前兩個,即從interface{}到反射對象和從反射對象到interface{},需要的朋友可以參考下
    2022-12-12

最新評論