Golang Gin 框架之日志 DIY(七)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Gin 是使用纯 Golang 语言实现的 HTTP Web 框架,Gin 的接口设计简洁,性能极高,现在被广泛使用。上一篇文章介绍了 Gin 中间件的相关内容,今天我们详细看一看 Gin 在日志管理模块方面的内容。

目录

  • 前言
  • 正文
  • 写日志文件
  • 自定义日志输出格式
  • 结尾

前言

Gin 是使用纯 Golang 语言实现的 HTTP Web 框架,Gin 的接口设计简洁,性能极高,现在被广泛使用。上一篇文章介绍了 Gin 中间件的相关内容,今天我们详细看一看 Gin 在日志管理模块方面的内容。

正文

写日志文件

在服务端有持续化存储的日志非常有必要,因为我们需要对历史问题进行排查,日志是我们必备的辅助工具。利用 Gin 框架,我们可以非常简单的完成日志收集工作,下面是示例代码:

funcmain() {
// 不启动颜色控制gin.DisableConsoleColor()
// 创建日志文件f, _ :=os.Create("gin.log")
gin.DefaultWriter=io.MultiWriter(f)
// 使用如下代码,可以实现日志文件记录和 console 同步显示// gin.DefaultWriter = io.MultiWriter(f, os.Stdout)router :=gin.Default()
router.GET("/ping", func(c*gin.Context) {
c.String(200, "pong")
    })
router.Run(":8080")
}

上面的代码显示,我们创建了名为 gin.log 的日志文件,同时将 Gin 自身日志模块的输出内容和日志文件进行绑定,实现记录历史日志的功能。

自定义日志输出格式

上面我们实现了把日志保存到文件中的功能,那么我们可以定义其中的日志输出格式吗?答案是肯定,而且我们还可以非常灵活的实现日志输出格式的定义。

funcmain() {
router :=gin.New()
router.Use(gin.LoggerWithFormatter(func(paramgin.LogFormatterParams) string {
// 自定义日志输出格式returnfmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n",
param.ClientIP,
param.TimeStamp.Format(time.RFC1123),
param.Method,
param.Path,
param.Request.Proto,
param.StatusCode,
param.Latency,
param.Request.UserAgent(),
param.ErrorMessage,
        )
    }))
// 应用崩溃恢复中间件router.Use(gin.Recovery())
router.GET("/ping", func(c*gin.Context) {
c.String(200, "pong")
    })
router.Run(":8080")
}

如上述代码所示,我们定义了日志格式包含了 param.ClientIP(客户端IP), param.TimeStamp.Format(time.RFC1123)(时间戳), param.Method(接口请求类型), param.Path(API路由), param.Request.Proto(协议), param.StatusCode(结果状态码,正常是 200), param.Latency(延时), param.Request.UserAgent()(客户端类型), param.ErrorMessage(错误信息)。

我们分别使用 curl 和 chrome 去接请求上述 /ping 接口进行效果测试,下面是服务器端的日志结果:

::1 - [Sat, 27 Nov 2021 17:04:22 CST] "GET /ping HTTP/1.1 200 84.952µs "curl/7.64.1" "
::1 - [Sat, 27 Nov 2021 17:21:14 CST] "GET /ping HTTP/1.1 200 53.335µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36" "
::1 - [Sat, 27 Nov 2021 17:21:15 CST] "GET /favicon.ico HTTP/1.1 404 650ns "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36" "
复制代码

演示效果截图:

image.png

通过上述结果可以看到,我们自定义的日志输出格式已经生效了,OK,大功告成!

结尾

好了,今天关于 Gin 框架的日志管理的内容就介绍这么多,感兴趣的话,就自己动手 DIY 一下吧!



作者简介:大家好,我是 Data-Mining(liuzhen007),是一位典型的音视频技术爱好者,同时也是CSDN博客专家、华为云享专家(共创编辑)、InfoQ 签约作者,欢迎关注我分享更多干货!


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
2月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
48 3
Golang语言之Prometheus的日志模块使用案例
|
2月前
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
|
3月前
|
JSON Go API
一文搞懂 Golang 高性能日志库 - Zap
一文搞懂 Golang 高性能日志库 - Zap
188 2
|
3月前
|
人工智能 数据库连接 Go
Golang 搭建 WebSocket 应用(五) - 消息推送日志
Golang 搭建 WebSocket 应用(五) - 消息推送日志
33 1
|
3月前
|
存储 JSON Go
一文搞懂 Golang 高性能日志库 Zerolog
一文搞懂 Golang 高性能日志库 Zerolog
287 0
|
4月前
|
JSON 中间件 Go
Go语言Web框架Gin介绍
【7月更文挑战第19天】Gin是一个功能强大、高性能且易于使用的Go语言Web框架。它提供了路由、中间件、参数绑定等丰富的功能,帮助开发者快速构建高质量的Web应用。通过本文的介绍,你应该对Gin框架有了初步的了解,并能够使用它来开发简单的Web服务。随着你对Gin的深入学习和实践,你将能够利用它构建更复杂、更强大的Web应用。
|
3月前
|
关系型数据库 API Go
[golang]在Gin框架中使用JWT鉴权
[golang]在Gin框架中使用JWT鉴权
100 0
|
3月前
|
网络协议 Go
[golang]gin框架接收websocket通信
[golang]gin框架接收websocket通信
|
3月前
|
JSON 安全 Go
[golang]使用logrus自定义日志模块
[golang]使用logrus自定义日志模块