Go语言的Zap日志库
一、为什么使用?
1、对于go内置的log库,只有print级别,不存在多级别的日志,并且错误日志Fatal和panic也是调用了os.Exit(0)会直接退出程序;
2、Uber-go zap提供了结构化日志记录和Printf风格的日志记录;能够将事件记录到文件中,而不是应用程序控制台。日志切割-能够根据文件大小、时间或间隔等来切割日志文件。支持不同的日志级别。例如INFO,DEBUG,ERROR等。能够打印基本信息,如调用文件/函数名和行号,日志时间等。
二、使用
1、引入
import "go.uber.org/zap"
2、定制logger
//zapcore.Encoder设置log记录格式
func getEncoder() zapcore.Encoder {
return zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
//也可以修改为控制台输出
//return zapcore.NewConsoleEncoder(zap.NewProductionEncoderConfig())
}
//Writer配置文件夹路径
func getLogWriter() zapcore.WriteSyncer {
file, _ := os.Create("./test.log")
return zapcore.AddSync(file)
}
//获得New函数的第一个参数,第三个参数为权限参数,设置日志哪种级别能写入
core:=NewCore(encoder,writer,zapcore.DebugLevel)
//返回logger指针对象
func New(core zapcore.Core, options ...Option) *Logger
3、修改encoderConfig配置
修改Encoder函数配置
//修改之前直接返回return zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
//修改后增加encoderConfig的配置
func getEncoder() zapcore.Encoder{
encoderConfig := zap.NewProductionEncoderConfig() //Add Encoding Config
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder //Add Time Config
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder //Add Big Writer
return zapcore.NewJSONEncoder(encoderConfig) //return core Add encoderConfig,ago Add zap.NewProductionEncoderConfig()
}
//在New方法中增加配置,在日志中显示是那个函数调用出现了错误
//增加option()zap.AddCaller()回调函数
logger=zap.New(core,zap.AddCaller()) //return my logger
三、切割归档
由于日志可能会过大,以后打开文件不方便,需要切割成一部分一部分的小文件,Zap不包含切割方法,需要使用Lumberjack切割
1、引入包
github.com/natefinch/lumberjack
2、加入切割功能
//修改writer中的配置
//修改前
func getWriter() zapcore.WriteSyncer{
file,_:=os.OpenFile("test.log",os.O_CREATE|os.O_RDWR|os.O_APPEND,0666)
return zapcore.AddSync(file)
}
//修改后
func getWriter() zapcore.WriteSyncer{
lumberJackLogger := &lumberjack.Logger{
Filename: "./test.log",
MaxSize: 10, //每个文件最大占用内存,单位M
MaxBackups: 5, //备份数量
MaxAge: 30, //备份的天数
Compress: false, //是否压缩
}
return zapcore.AddSync(lumberJackLogger)
}
四、设置日志信息输出在终端
因为开发阶段输出到终端就不用每次都打开日志文件,会变得更加方便,所以需要根据配置文件的mode这一项中的值来判断日志的输出位置
(1)在初始化log信息的时候判断是不是开发模式,开发模式需要输出在终端
if mode=="dev"{
consoleEncoder:=zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())
core=zapcore.NewTee(
zapcore.NewCore(encoder,writer,zapcore.DebugLevel),
zapcore.NewCore(consoleEncoder,zapcore.Lock(os.Stdout),zapcore.DebugLevel),
)
}else {
core=zapcore.NewCore(encoder,writer,zapcore.DebugLevel)
}
(2)注册路由的时候判断是什么模式
if mode==gin.ReleaseMode{
gin.SetMode(gin.ReleaseMode)
}
如果看完对自己有所帮助,请点赞支持