Uso de zap de la biblioteca de registros de alto rendimiento de golang

Autor: Chen Jinjian
Blog personal: HTTPS: //jian1098.github.io
Blog de CSDN: https: //blog.csdn.net/c_jian
Libro de Jane: https: //www.jianshu.com/u/8ba9ac5706b6
Contacto: jian1098 @ qq.com

Resumen

zapEs Uberuna biblioteca de registros de Go muy rápida, estructurada y de nivel de registro desarrollada. Según la documentación de Uber-go Zap, su rendimiento es mejor que los paquetes de registros estructurados similares y más rápido que la biblioteca estándar. La prueba de rendimiento específica puede ir githuba ver.

dirección de github:https://github.com/uber-go/zap

Crea una instancia

Llamando zap.NewProduction()/ zap.NewDevelopment()o zap.Example()la creación de un registrador. La diferencia entre estos tres métodos es que registrará información diferente y los parámetros solo pueden ser stringtipos

//代码
var log *zap.Logger
log = zap.NewExample()
log, _ := zap.NewDevelopment()
log, _ := zap.NewProduction()
log.Debug("This is a DEBUG message")
log.Info("This is an INFO message")

//Example 输出
{
    
    "level":"debug","msg":"This is a DEBUG message"}
{
    
    "level":"info","msg":"This is an INFO message"}

//Development 输出
2018-10-30T17:14:22.459+0800    DEBUG    development/main.go:7    This is a DEBUG message
2018-10-30T17:14:22.459+0800    INFO    development/main.go:8    This is an INFO message

//Production 输出
{
    
    "level":"info","ts":1540891173.3190675,"caller":"production/main.go:8","msg":"This is an INFO message"}
{
    
    "level":"info","ts":1540891173.3191047,"caller":"production/main.go:9","msg":"This is an INFO message with fields","region":["us-west"],"id":2}

Comparación de tres métodos de creación:

  • ExampleY Productionuse la jsonsalida de formato, Developmentuse la forma de salida de línea
  • Development
    • Imprima en la pila desde el nivel de advertencia para rastrear
    • Imprimir siempre paquete / archivo / línea (método)
    • Agregue cualquier campo adicional al final de la línea como una cadena json
    • Nombre del nivel de impresión en mayúsculas
    • Imprima la marca de tiempo en formato ISO8601 en milisegundos
  • Production
    • Los mensajes de nivel de depuración no se registran
    • Error, registros de nivel Dpanic, rastreará el archivo en la pila, Warn no lo hará.
    • Siempre agregue la persona que llama al archivo
    • Imprimir fecha en formato de marca de tiempo
    • Imprimir el nombre del nivel en minúsculas

Salida formateada

Hay dos tipos de zap, *zap.Loggery la *zap.SugaredLoggerúnica diferencia entre ellos es que obtenemos . Sugar()uno llamando al método del registrador principal SugaredLoggery luego usamos SugaredLoggerel printfformato para registrar la declaración, por ejemplo

var sugarLogger *zap.SugaredLogger

func InitLogger() {
    
    
  logger, _ := zap.NewProduction()
    sugarLogger = logger.Sugar()
}

func main() {
    
    
    InitLogger()
    defer sugarLogger.Sync()
    sugarLogger.Errorf("Error fetching URL %s : Error = %s", url, err)
}

Escribir archivo

De forma predeterminada, los registros se imprimirán en la interfaz de la consola de la aplicación, pero para la comodidad de la consulta, los registros se pueden escribir en un archivo, pero ya no podemos usar los 3 métodos para crear una instancia, sino usarzap.New()

package main

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"os"
)

var log *zap.Logger
func main() {
    
    
	writeSyncer, _ := os.Create("./info.log")							//日志文件存放目录
	encoderConfig := zap.NewProductionEncoderConfig()					 //指定时间格式
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
	encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
	encoder := zapcore.NewConsoleEncoder(encoderConfig)					//获取编码器,NewJSONEncoder()输出json格式,NewConsoleEncoder()输出普通文本格式
	core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)	 //第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志
	log = zap.New(core,zap.AddCaller())								   //AddCaller()为显示文件名和行号
	log.Info("hello world")
	log.Error("hello world")
}

Resultados de la salida del archivo de registro:

2020-12-16T17:53:30.466+0800	INFO	geth/main.go:18	hello world
2020-12-16T17:53:30.486+0800	ERROR	geth/main.go:19	hello world

Salida de consola y archivo al mismo tiempo

Si necesita generar la consola y los archivos al mismo tiempo, solo necesita modificarlo zapcore.NewCore. Ejemplo:

package main

import (
	"github.com/natefinch/lumberjack"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"os"
)

var log *zap.Logger

func main() {
    
    
	//获取编码器,NewJSONEncoder()输出json格式,NewConsoleEncoder()输出普通文本格式
	encoderConfig := zap.NewProductionEncoderConfig()
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder //指定时间格式
	encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
	encoder := zapcore.NewConsoleEncoder(encoderConfig)

	//文件writeSyncer
	fileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{
    
    
		Filename:   "./info.log", //日志文件存放目录
		MaxSize:    1,            //文件大小限制,单位MB
		MaxBackups: 5,            //最大保留日志文件数量
		MaxAge:     30,           //日志文件保留天数
		Compress:   false,        //是否压缩处理
	})
	fileCore := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(fileWriteSyncer,zapcore.AddSync(os.Stdout)), zapcore.DebugLevel) //第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志

	log = zap.New(fileCore, zap.AddCaller()) //AddCaller()为显示文件名和行号


	log.Info("hello world")
	log.Error("hello world")
}

Corte de archivos

Los archivos de registro crecerán cada vez más con el tiempo. Para evitar que los archivos de registro llenen el espacio del disco duro, los archivos de registro deben cortarse de acuerdo con las condiciones. El paquete zap en sí no proporciona la función de corte de archivos, pero puede lumberjackprocesarse con paquetes recomendados por funcionarios de zap.

	//文件writeSyncer
	fileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{
    
    
		Filename:   "./info.log", //日志文件存放目录,如果文件夹不存在会自动创建
		MaxSize:    1,            //文件大小限制,单位MB
		MaxBackups: 5,            //最大保留日志文件数量
		MaxAge:     30,           //日志文件保留天数
		Compress:   false,        //是否压缩处理
	})

Escribir archivos por nivel

Para facilitar la consulta del personal de administración, generalmente necesitamos almacenar los registros por debajo del nivel de error en el info.log, y almacenar los registros con el nivel de gravedad del error y superior en el archivo error.log. Solo necesitamos modifique zapcore.NewCoreel tercer parámetro del método y luego agregue el archivo WriteSyncerdividido en info, y errordos al ejemplo:

package main

import (
	"github.com/natefinch/lumberjack"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"os"
)

var log *zap.Logger

func main() {
    
    
	var coreArr []zapcore.Core

	//获取编码器
	encoderConfig := zap.NewProductionEncoderConfig()				//NewJSONEncoder()输出json格式,NewConsoleEncoder()输出普通文本格式
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder 			//指定时间格式
	encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder	//按级别显示不同颜色,不需要的话取值zapcore.CapitalLevelEncoder就可以了
	//encoderConfig.EncodeCaller = zapcore.FullCallerEncoder      	//显示完整文件路径
	encoder := zapcore.NewConsoleEncoder(encoderConfig)

	//日志级别
	highPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool{
    
    	//error级别
		return lev >= zap.ErrorLevel
	})
	lowPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool {
    
    	//info和debug级别,debug级别是最低的
		return lev < zap.ErrorLevel && lev >= zap.DebugLevel
	})

	//info文件writeSyncer
	infoFileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{
    
    
		Filename:   "./log/info.log", 	//日志文件存放目录,如果文件夹不存在会自动创建
		MaxSize:    1,            		//文件大小限制,单位MB
		MaxBackups: 5,            		//最大保留日志文件数量
		MaxAge:     30,           		//日志文件保留天数
		Compress:   false,        		//是否压缩处理
	})
	infoFileCore := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(infoFileWriteSyncer,zapcore.AddSync(os.Stdout)), lowPriority) //第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志
	//error文件writeSyncer
	errorFileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{
    
    
		Filename:   "./log/error.log", 		//日志文件存放目录
		MaxSize:    1,            			//文件大小限制,单位MB
		MaxBackups: 5,            			//最大保留日志文件数量
		MaxAge:     30,           			//日志文件保留天数
		Compress:   false,        			//是否压缩处理
	})
	errorFileCore := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(errorFileWriteSyncer,zapcore.AddSync(os.Stdout)), highPriority) //第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志

	coreArr = append(coreArr, infoFileCore)
	coreArr = append(coreArr, errorFileCore)
	log = zap.New(zapcore.NewTee(coreArr...), zap.AddCaller()) //zap.AddCaller()为显示文件名和行号,可省略

	log.Info("hello info")
	log.Debug("hello debug")
	log.Error("hello error")
}

Después de esta modificación, infoy debugnivel de inicio de sesión en la tienda info.log, errornivel de inicio de sesión en un error.logarchivo separado en el

La consola muestra colores por nivel

Simplemente especifique el codificador EncodeLevel,

	//获取编码器
	encoderConfig := zap.NewProductionEncoderConfig()				//NewJSONEncoder()输出json格式,NewConsoleEncoder()输出普通文本格式
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder 			//指定时间格式
	encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder	//按级别显示不同颜色,不需要的话取值zapcore.CapitalLevelEncoder就可以了
	encoder := zapcore.NewConsoleEncoder(encoderConfig)

Muestra la ruta del archivo y el número de línea

Como se mencionó anteriormente, para mostrar la ruta del archivo y el número de línea, solo necesita zap.Newagregar parámetros zap.AddCaller()al método . Si desea mostrar la ruta completa, debe especificarlo en la configuración del codificador

	//获取编码器
	encoderConfig := zap.NewProductionEncoderConfig()				//NewJSONEncoder()输出json格式,NewConsoleEncoder()输出普通文本格式
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder 			//指定时间格式
	encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder	//按级别显示不同颜色,不需要的话取值zapcore.CapitalLevelEncoder就可以了
	encoderConfig.EncodeCaller = zapcore.FullCallerEncoder      	//显示完整文件路径
	encoder := zapcore.NewConsoleEncoder(encoderConfig)

Código completo

package main

import (
	"github.com/natefinch/lumberjack"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"os"
)

var log *zap.Logger

func main() {
    
    
	var coreArr []zapcore.Core

	//获取编码器
	encoderConfig := zap.NewProductionEncoderConfig()				//NewJSONEncoder()输出json格式,NewConsoleEncoder()输出普通文本格式
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder 			//指定时间格式
	encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder	//按级别显示不同颜色,不需要的话取值zapcore.CapitalLevelEncoder就可以了
	//encoderConfig.EncodeCaller = zapcore.FullCallerEncoder      	//显示完整文件路径
	encoder := zapcore.NewConsoleEncoder(encoderConfig)

	//日志级别
	highPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool{
    
    	//error级别
		return lev >= zap.ErrorLevel
	})
	lowPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool {
    
    	//info和debug级别,debug级别是最低的
		return lev < zap.ErrorLevel && lev >= zap.DebugLevel
	})

	//info文件writeSyncer
	infoFileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{
    
    
		Filename:   "./log/info.log", 	//日志文件存放目录,如果文件夹不存在会自动创建
		MaxSize:    2,            		//文件大小限制,单位MB
		MaxBackups: 100,            	//最大保留日志文件数量
		MaxAge:     30,           		//日志文件保留天数
		Compress:   false,        		//是否压缩处理
	})
	infoFileCore := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(infoFileWriteSyncer,zapcore.AddSync(os.Stdout)), lowPriority) //第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志
	//error文件writeSyncer
	errorFileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{
    
    
		Filename:   "./log/error.log", 		//日志文件存放目录
		MaxSize:    1,            			//文件大小限制,单位MB
		MaxBackups: 5,            			//最大保留日志文件数量
		MaxAge:     30,           			//日志文件保留天数
		Compress:   false,        			//是否压缩处理
	})
	errorFileCore := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(errorFileWriteSyncer,zapcore.AddSync(os.Stdout)), highPriority) //第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志

	coreArr = append(coreArr, infoFileCore)
	coreArr = append(coreArr, errorFileCore)
	log = zap.New(zapcore.NewTee(coreArr...), zap.AddCaller()) //zap.AddCaller()为显示文件名和行号,可省略


	log.Info("hello info")
	log.Debug("hello debug")
	log.Error("hello error")
}

Articulo de referencia

Utilice la biblioteca de registros de Zap en un proyecto de idioma Go-Zhihu (zhihu.com)

[ Ejemplo de configuración zap de la biblioteca de registros de alto rendimiento de Golang: ExplorerMan-Blog Park (cnblogs.com) ] (https://zhuanlan.zhihu.com/p/88856378?utm_source=wechat_session)

Supongo que te gusta

Origin blog.csdn.net/C_jian/article/details/111315457
Recomendado
Clasificación