一、zap介绍
在许多go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能:
1.能够将事件记录到文件中,而不是应用程序控制台。
2.日志切割-能够根据文件大小、时间或间隔等来切割日志文件。
3.支持不同的日志级别。例如info,debug,error等。
4.能够打印基本信息,如调用文件/函数名和行号,日志时间等。
二、安装及使用
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基础上调用logger.suger() func initlogger() *zap.sugaredlogger{ logger ,_ := zap.newproduction() return logger.sugar() }
而初始化logger调用的函数可以通过调用zap.newproduction()/zap.newdevelopment()
或者zap.example()
创建一个logger。区别就是一个是以json的格式返回,一个是以终端标准输出带有空格返回。
newproducts()
newdevelopment()
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需要设置三个参数encoder,writesyncer,loglevelencoder:编译器,通俗说就是输出日志是什么格式,json or 终端格式。
json格式就使用newjsonencoder(),并使用预先设置的productionencoderconfig(): zapcore.newjsonencoder(zap.newproductionencoderconfig()) 终端格式就使用newconsoleencoder(): zapcore.newconsoleencoder(zap.newproductionencoderconfig())
writesyncer:将日志输出到哪。使用zapcore.addsync()函数并且将打开的文件句柄传进去。
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, ) //创建logger logger:= zap.new(core) return logger.sugar() }
2.4.2 若输出到文件和终端,只需要更改writesyncer参数
//使用自定义的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, ) //创建logger logger:= zap.new(core) return logger.sugar() }
效果:
2.4.3 将输出的时间转化
//设置日志编译器,什么类型的日志 func getencoder() zapcore.encoder{ //encoder配置 encoderconfig := zap.newproductionencoderconfig() //设置时间格式为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详细记录调用的代码行,addcallerskip(1)调用链很多时直接跳过
logger:= zap.new(core,zap.addcaller(), zap.addcallerskip(1))
3. 记录全日志,错误日志文件,同步终端,标准时间,记录代码位置的自定义logger代码
点击查看代码
[========]
[========]
4.使用lumberjack进行日志切割归档
//设置输出位置 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, ) //创建单个logger // logger:= zap.new(core1,zap.addcaller(), zap.addcallerskip(1)) //addcaller详细记录调用的代码行,addcallerskip(1)调用链很多时直接跳过 // return logger.sugar() //创建双日志,全日志和错误日志 c:=zapcore.newtee(core1,core2) logger:= zap.new(c,zap.addcaller()) return logger.sugar() } //设置日志编译器,什么类型的日志 func getencoder() zapcore.encoder{ //encoder配置 encoderconfig := zap.newproductionencoderconfig() //设置时间格式为2024-9-1-12.32 encoderconfig.encodetime = zapcore.iso8601timeencoder encoderconfig.encodelevel = zapcore.capitallevelencoder //json格式 // jsonencoder := zapcore.newjsonencoder(encoderconfig) //终端形式 consoleencoder := zapcore.newconsoleencoder(encoderconfig) return consoleencoder } //设置输出位置 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日志记录器
到此这篇关于go日志管理库zap的文章就介绍到这了,更多相关go日志管理库zap内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论