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
zap
Es Uber
una 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 github
a 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 string
tipos
//代码
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:
Example
YProduction
use lajson
salida de formato,Development
use la forma de salida de líneaDevelopment
- 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.Logger
y la *zap.SugaredLogger
única diferencia entre ellos es que obtenemos . Sugar()
uno llamando al método del registrador principal SugaredLogger
y luego usamos SugaredLogger
el printf
formato 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 lumberjack
procesarse 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.NewCore
el tercer parámetro del método y luego agregue el archivo WriteSyncer
dividido en info
, y error
dos 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, info
y debug
nivel de inicio de sesión en la tienda info.log
, error
nivel de inicio de sesión en un error.log
archivo 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.New
agregar 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)