go语言 gin框架中集成zap日志库
在go语言gin框架中,日志是默认输出到终端的,但是我们在实际工作中,一般来说是需要记录服务器日志的。而最常用的日志库就是zap日志库,我们需要将gin在终端输出的内容通过zap日志库记录到文件中,首先我们看gin默认的日志输出:
package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()r.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "hello gin!")})r.Run(":80")
}
代码中我们起了一个80端口的服务,访问这个端口"/"目录时,gin在终端打印的日志如下:
但是在生产环境中,这样做显然是不符合要求的,此时我们就需要将日志输出到文件中,这时候我们就不能使用gin.Default()函数来初始化引擎了,我们会用到另一个函数:gin.New()和Engine.Use(),我们先看gin中gin.Default()的源码:
// Default returns an Engine instance with the Logger and Recovery middleware already attached.
func Default() *Engine {debugPrintWARNINGDefault()engine := New()engine.Use(Logger(), Recovery())return engine
}
我们可以发现实际上gin.Default()就是对gin.New()和Engine.Use()的一个封装而已,而Engine.Use()中的两个全局中间件就是决定我们日志记录方式的关键。那么我们要根据自己的意愿记录日志的话,那么我们就需要自己去实现这两个中间件,然后使用Engine.Use()将我们的中间件导入就可以了。在这之前,我们先来初始化我们的zap日志库:
// 此处用到另外一个第三方库lumberjack,可以实现日志切割等功能,具体的配置项可自行配置,此处是输出json格式的日志
func InitZap() {encoderConfig := zapcore.EncoderConfig{TimeKey: "ts",LevelKey: "level",NameKey: "Logger",CallerKey: "caller",FunctionKey: zapcore.OmitKey,MessageKey: "msg",StacktraceKey: "stacktrace",LineEnding: zapcore.DefaultLineEnding,EncodeLevel: zapcore.LowercaseLevelEncoder,EncodeTime: zapcore.ISO8601TimeEncoder,EncodeDuration: zapcore.SecondsDurationEncoder,EncodeCaller: zapcore.ShortCallerEncoder,}encoder := zapcore.NewJSONEncoder(encoderConfig)lumberjackLogger := &lumberjack.Logger{Filename: "test.log",MaxSize: 10,}writeSyncer := zapcore.AddSync(lumberjackLogger)var l zapcore.Levelerr := l.UnmarshalText([]byte("debug"))if err != nil {panic(err)}core := zapcore.NewCore(encoder, writeSyncer, l)lg := zap.New(core, zap.AddCaller())zap.ReplaceGlobals(lg)
}
接下来我们来实现上面所说的那两个中间件:
Logger()实现方法:
// GinLogger 接收gin框架默认的日志
func GinLogger() gin.HandlerFunc {return func(c *gin.Context) {start := time.Now()path := c.Request.URL.Pathquery := c.Request.URL.RawQuery c.Next()cost := time.Since(start) // 本次请求的总共消耗时间// 写入日志zap.L().Info(path,zap.Int("status", c.Writer.Status()),zap.String("method", c.Request.Method),zap.String("path", path),zap.String("query", query),zap.String("ip", c.ClientIP()),zap.String("user-agent", c.Request.UserAgent()),zap.String("errors", c.Errors.ByType(gin.ErrorTypePrivate).String()),zap.Duration("cost", cost),)}
}
Recovery()实现方法:
// GinRecovery recover掉项目可能出现的panic
// 此函数是捕获panic,根据gin框架内的Recovery修改的
func GinRecovery(stack bool) gin.HandlerFunc {return func(c *gin.Context) {defer func() {if err := recover(); err != nil {var brokenPipe boolif ne, ok := err.(*net.OpError); ok {if se, ok := ne.Err.(*os.SyscallError); ok {if strings.Contains(strings.ToLower(se.Error()), "broken pipe") || strings.Contains(strings.ToLower(se.Error()), "connection reset by peer") {brokenPipe = true}}}httpRequest, _ := httputil.DumpRequest(c.Request, false)if brokenPipe {zap.L().Error(c.Request.URL.Path,zap.Any("error", err),zap.String("request", string(httpRequest)),)c.Error(err.(error)) c.Abort()return}if stack {zap.L().Error("[Recovery from panic]",zap.Any("error", err),zap.String("request", string(httpRequest)),zap.String("stack", string(debug.Stack())),)} else {zap.L().Error("[Recovery from panic]",zap.Any("error", err),zap.String("request", string(httpRequest)),)}c.AbortWithStatus(http.StatusInternalServerError)}}()c.Next()}
}
现在我们用上我们上面编写的代码来启一个服务:
func main() {InitZap()r := gin.New()r.Use(GinLogger(), GinRecovery(true))r.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "hello gin!")})r.Run(":80")
}
这个时候再访问一下127.0.0.1就会发现你的当前目录下多了一个test.log的文件,打开后发现里面的内容是一条json格式的日志:
{"level":"info","ts":"2022-10-20T14:09:30.815+0800","caller":"test/test_main.go:26","msg":"/","status":200,"method":"GET","path":"/","query":"","ip":"127.0.0.1","user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36","errors":"","cost":0}
这样我们就把gin中默认输出到终端的日志记录到.log文件中了!
如果本篇博客帮助到了您,请点一个赞。感谢!
go语言 gin框架中集成zap日志库相关推荐
- 在Go语言项目中使用Zap日志库
在Go语言项目中使用Zap日志库 Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 一.在Go语言项目中使用 ...
- (1)go web开发之 zap日志库的使用及gin框架配置zap记录日志详细文档讲解分析
(一)介绍 zap 是go 中比较火的一个日志库,提供不同级别的日志,并且速度快 官方文档: https://pkg.go.dev/go.uber.org/zap#section-readme, 也可 ...
- Go 语言中的 logger 和 zap 日志库
目录 Go 语言中的 logger 和 zap 日志库 Go Logger Zap Logger Logger Sugared Logger 定制 Logger 记录到文件中 Zap logger 中 ...
- Gin框架组合(Zap、lumberjack、ini)使用手册
Gin Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,已经发布了1.0版本.具有快速灵活,容错方便等特点.其实对于golang而言,web框架的依赖要远比Python, ...
- Go开发中配置一个Logger日志的功能实现(结合zap日志库)
为什么需要Logger 一般在开发项目的时候我们都是需要一个存储日志的文件,因为在部署项目以后,我们只能通过去筛查日志进行检索问题,这时候日志是否可以呈现清晰这个对于我们进行排查工作是十分重要的,所以 ...
- 【Go进阶】如何让你Go项目中日志清晰有趣-Zap日志库
本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. Zap日志库在Go语言项目中的使用 在许多Go ...
- Go 语言 Gin 框架实战项目笔记
Go 语言 Gin 框架实战 后端 Goland 操作 创建项目 运行项目 数据库操作 jwt.Response 配置管理 获取请求参数 数据验证 使用 UUID 前端 环境搭建 创建项目 ESLin ...
- Go语言Gin框架源码分析
gin框架路由详解 gin框架使用的是定制版本的httprouter,其路由的原理是大量使用公共前缀的树结构,它基本上是一个紧凑的Trie tree(或者只是Radix Tree).具有公共前缀的节点 ...
- go.uber.org/zap日志库
文章目录 go.uber.org/zap日志库 1.GO SDK里Logger优缺点 2.介绍Uber-go zap 3.安装zap依赖 4.zap.NewProductionEncoderConfi ...
最新文章
- 树莓派3b python3.6.1 SSL模块调用不起来的坑
- 如何通过构建以太坊智能合约来销售商品
- python flask 基础入门
- itextpdf添加表格元素_基操勿6第四期:PPT表格美化
- vue项目H5 跳转微信小程序
- 怎么查看linux硬盘多路径,linux下磁盘多路径
- 曝光!人工智能行业薪酬到底有多高?
- java窗口淡出_java淡入淡出式显示gui
- 创建一个 scrapy 爬虫项目
- torch.distributed多卡/多GPU/分布式DPP(二)—torch.distributed.all_reduce(reduce_mean)barrier控制进程执行顺序seed随机种子
- css实现背景图片透明内容不透明
- 【PS】443种逼真度超高水彩笔刷打包下载
- linux 播放wav文件,Java音频无法在Linux中播放wav文件
- java 判断字符 不等于 或者_java中字符串不等于怎么判断
- keil5 c语言运行
- 信号时域频域特征公式
- 前端开发框架:Ajax的基本入门和使用。
- vue2[初级]事件处理器
- android项目实现查询功能,Android实现归属地查询功能(示例代码)
- 前端培训一般要多少钱