gin: 用zap记录访问日志

一,安装zap

$ go get -u go.uber.org/zap
go: downloading go.uber.org/zap v1.27.0
go: downloading go.uber.org/multierr v1.10.0
go: downloading go.uber.org/multierr v1.11.0
go: added go.uber.org/multierr v1.11.0
go: added go.uber.org/zap v1.27.0

二,测试一个例子:

//得到列表
func (ic *ImageController) List(c *gin.Context) {//logger := zap.NewExample()cfg := zap.NewProductionConfig()cfg.OutputPaths = []string{"/data/gologs/logs/access.log",//"stderr","stdout",}logger,err := cfg.Build()if err!=nil {fmt.Println("日志启动出错:",err.Error())return}defer logger.Sync()timeStr := time.Now().Format("2006-01-02 15:04:05")logger.Info("记录一条日志",zap.String("time", timeStr),zap.String("url", c.Request.URL.String()),)c.JSON(http.StatusOK, gin.H{"message": "image list",})
}

输出例子:

{"level":"info","ts":1738244531.3267372,"caller":"controller/ImageController.go:54","msg":"记录一条日志","time":"2025-01-30 21:42:11","url":"/image/list?a=1&bc=2"}

三,记录访问日志

package middlewareimport ("bytes""fmt""github.com/gin-gonic/gin""go.uber.org/zap""imagebank/global""io""time"
)type responseWriter struct {gin.ResponseWriterb *bytes.Buffer
}//重写 Write([]byte) (int, error) 方法
func(w responseWriter)Write(b []byte)(int, error) {//向一个bytes.buffer中写一份数据来为获取body使用w.b.Write(b)//完成gin.Context.Writer.Write()原有功能return w.ResponseWriter.Write(b)
}func AccessLog() gin.HandlerFunc {return func(c *gin.Context) {//请求 headerrequestHeader := c.Request.HeaderrequestHeaderStr:=fmt.Sprintf("%v",requestHeader)fmt.Println("请求头:",requestHeaderStr)//请求体 bodyrequestBody := ""b, err := c.GetRawData()if err != nil {requestBody = "failed to get request body"} else {requestBody = string(b)}c.Request.Body = io.NopCloser(bytes.NewBuffer(b))fmt.Println("请求体:",requestBody)writer := responseWriter{c.Writer,bytes.NewBuffer([]byte{}),}c.Writer = writerbeginTime := time.Now().UnixNano()c.Next()endTime := time.Now().UnixNano()duration:=endTime-beginTimecfg := zap.NewProductionConfig()cfg.OutputPaths = []string{"/data/gologs/logs/access.log",//"stderr","stdout",}logger,err := cfg.Build()if err!=nil {fmt.Println("日志启动出错:",err.Error())return}defer logger.Sync()timeStr := time.Now().Format("2006-01-02 15:04:05")//响应状态码responseStatus := c.Writer.Status()//响应 headerresponseHeader := c.Writer.Header()responseHeaderStr := fmt.Sprintf("%v",responseHeader)//响应体大小responseBodySize := c.Writer.Size()//响应体 bodyresponseBody := writer.b.String()logger.Info("记录一条日志",zap.String("time", timeStr),zap.String("ip", c.ClientIP()),zap.String("proto", c.Request.Proto),zap.String("method", c.Request.Method),zap.String("host", c.Request.Host),zap.String("url", c.Request.URL.String()),zap.String("get_params", global.GetAllGetParams(c)),zap.String("post_params", global.GetAllPostParams(c)),zap.String("UserAgent", c.Request.UserAgent()),//请求头,请求体zap.String("requestHeader", requestHeaderStr),zap.String("requestBody", requestBody),//响应头、响应体zap.Int("responseStatus", responseStatus),zap.String("responseHeader", responseHeaderStr),zap.Int("responseBodySize", responseBodySize),zap.String("responseBody", responseBody),//时长,微秒zap.Int64("duration", duration/1000),)}
}

 

四,测试效果:

{"level":"info","ts":1738288864.7150245,"caller":"middleware/accesslog.go:122","msg":"记录一条日志","time":"2025-01-31 10:01:04","ip":"192.168.219.1","proto":"HTTP/1.1","method":"GET","host":"192.168.219.3:8080","url":"/image/list?a=1&bc=2","get_params":"key:a,value:1\nkey:bc,value:2\n","post_params":"","UserAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36","requestHeader":"map[Accept:[text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7] Accept-Encoding:[gzip, deflate] Accept-Language:[zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,ja;q=0.6] Cache-Control:[max-age=0] Connection:[keep-alive] Cookie:[PHPSID=e239cbb4d5ddd941f501d2d3a9cca3d5] Upgrade-Insecure-Requests:[1] User-Agent:[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36]]","requestBody":"","responseStatus":200,"responseHeader":"map[Content-Type:[application/json; charset=utf-8]]","responseBodySize":24,"responseBody":"{\"message\":\"image list\"}","duration":42}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/877246.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python GIL(全局解释器锁)机制对多线程性能影响的深度分析

在Python开发领域,GIL(Global Interpreter Lock)一直是一个广受关注的技术话题。在3.13已经默认将GIL去除,在详细介绍3.13的更亲前,我们先要留了解GIL的技术本质、其对Python程序性能的影响。本文将主要基于CPython(用C语言实现的Python解释器,也是目前应用最广泛的Pyth…

java中的ArrayBlockingQueue

ArrayBlockingQueue ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个线程安全的阻塞队列实现。 它基于数组实现,容量固定,支持先进先出的顺序。 Array Blocking Queue 数组阻塞队列 读音: [əˈreɪ] [ˈblɒkɪŋ] [kjuː] concurrent 同时发生的 /…

五. Redis 配置内容(详细配置说明)

五. Redis 配置内容(详细配置说明) @目录五. Redis 配置内容(详细配置说明)1. Units 单位配置2. INCLUDES (包含)配置3. NETWORK (网络)配置3.1 bind(配置访问内容)3.2 protected-mode (保护模式)3.3 port(端口)配置3.4 timeout(客户端超时时间)配置3.5 tcp-keepalive()配置4…

一文搞懂编程在开源软件运动中的应用

一文搞懂编程在开源软件运动中的应用一文搞懂编程在开源软件运动中的应用一理解开源软件运动文本内容开源软…………```HTML一文搞懂编程在开源软件运动中的应用一、理解开源软件运动:<!DOCTYPE html><html><head><meta charset="UTF-8"> &…

makefile在编译后输出STM32的Flash RAM占用情况的方法

本文介绍了在用makefile组织的STM32工程中,怎么在编译完成后计算并显示Flash和RAM占用情况的方法。知乎 - STM32 GCC工程编译后输出FLASH RAM使用占比的方法 里面这个方法看得我血压飙升,本身代码很不直观,写起来要反斜杠,还留了两行没用的代码,还有各种依赖命令,subst和…

您的干净代码可能是别人的技术债务

您的干净代码可能是别人的技术债务 为什么软件模式必须适应团队规模,以及如何正确操作。 大卫罗德纳斯 博士由作者生成 在软件开发中,我们面临着一个奇怪的悖论:对于一个团队来说,使代码更干净、更易维护、更优雅的架构决策,可能会让另一个团队觉得更复杂、更僵化、更麻烦…

读算法简史:从美索不达米亚到人工智能时代02古老的算法

苏美尔文字起源于湿黏土陶筹,楔形文字记录了苏美尔语,促进社会发展。阿卡德、巴比伦帝国相继统治,文字变迁。19世纪欧洲考古学家破译文字。美索不达米亚算法复杂,包括六十进制和毕达哥拉斯定理。埃及数学留存少,欧几里得算法著名。1. 苏美尔 1.1. 位于苏美尔地区的乌鲁克,…

计量经济学——空间计量概述(十八)

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 空间计量经济学(Spatial Econometrics)创新性地解决了经典计量方法在空间数据分析中的局限性,研究地理观测值之间的相互关系。近年来,在人文社会科学的“…

经济经济学——空间计量概述(十八)

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 空间计量经济学(Spatial Econometrics)创新性地解决了经典计量方法在空间数据分析中的局限性,研究地理观测值之间的相互关系。近年来,在人文社会科学的“…

Cisco NX-OS System Software - ACI 16.1(2g)F - 适用于 ACI 模式下的 Nexus 9000 系列交换机系统软件

Cisco NX-OS System Software - ACI 16.1(2g)F - 适用于 ACI 模式下的 Nexus 9000 系列交换机系统软件Cisco NX-OS System Software - ACI 16.1(2g)F 适用于 ACI 模式下的 Cisco Nexus 9000 系列交换机系统软件 请访问原文链接:https://sysin.org/blog/cisco-aci-16/ 查看最新…

Cisco APIC 6.1(2g)F - 应用策略基础设施控制器

Cisco APIC 6.1(2g)F - 应用策略基础设施控制器Cisco APIC 6.1(2g)F - 应用策略基础设施控制器 Application Policy Infrastructure Controller (APIC) 请访问原文链接:https://sysin.org/blog/cisco-apic-6/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org思科…

Python多线程爬取亚马逊商品数据

前言 新年快乐 1.环境准备 使用miniconda为亚马逊创建一个新环境,防止feapder和其他包冲突(比如scrapy)。 # 创建一个新的 Conda 环境: conda create -n python_feapder python=3.12# 查看已创建的环境 conda info --envs# 激活环境 conda activate python_feapder# 安装所…