全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何在Golang中管理Web日志_记录请求和响应信息

在 Go 中记录 Web 请求和响应信息的关键是通过中间件包装 http.ResponseWriter,捕获状态码与响应体大小,结合请求元数据提取和结构化日志输出;需自定义 ResponseWriter 重写 WriteHeader 和 Write 方法,过滤敏感字段,使用 zap 等库按状态码分级记录结构化日志。

在 Go 中记录 Web 请求和响应信息,关键不是“拦截响应体”,而是通过中间件包装 http.ResponseWriter,同时结合请求解析与结构化日志输出。原生 net/http 不提供响应内容访问接口,需手动封装。

用自定义 ResponseWriter 捕获状态码和响应体大小

实现一个包装器,嵌入原生 http.ResponseWriter,重写 WriteHeaderWrite 方法,记录真实状态码和写入字节数:

  • 定义结构体(如 responseWriter),保存 statusCodewrittensize
  • WriteHeader 中缓存状态码(避免被后续 Write 覆盖)
  • Write 中累加写入长度,并调用底层 Write
  • 注意:不建议完整读取并缓存响应体(内存/性能风险),除非业务强依赖响应内容(此时应单独做逻辑处理)

提取请求信息:URL、方法、IP、耗时、查询参数等

在中间件入口处即可获取大部分请求元数据:

  • r.Methodr.URL.Pathr.URL.RawQuery 直接可用
  • 客户端 IP 推荐用 r.Header.Get("X-Forwarded-For") 回退到 r.RemoteAddr
  • time.Now() 记录开始时间,defer 中计算耗时
  • 敏感字段(如密码、token)务必过滤,可用白名单或正则脱敏(如 strings.ReplaceAll(q, "token=", "token=[REDACTED]")

结构化日志输出(推荐 zap 或 zerolog)

避免拼接字符串日志,使用结构化日志库提升可检索性:

  • zap.With(...)zerolog.Dict().Str(...).Int(...) 添加字段
  • 必填字段建议:method、path、status、size、duration_ms、ip、user_agent、trace_id(如有)
  • 错误日志单独记录(如 logger.Error("request failed", zap.Error(err))),避免混在访问日志中
  • 日志级别按需设定:2xx 用 Info,4xx 用 Warn,5xx 用 Error

轻量级示例(基于 net/http + zap)

以下是一个可直接运行的中间件片段:

func loggingMiddleware(next http.Handler) http.Handler {
  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    start := time.Now()
    rw := &responseWriter{ResponseWriter: w, statusCode: http.StatusOK}
    next.ServeHTTP(rw, r)
    duration := time.Since(start).Milliseconds()
    fields := []zap.Field{
      zap.String("method", r.Method),
      zap.String("path", r.URL.Path),
      zap.Int("status", rw.statusCode),
      zap.Int64("size", rw.size),
      zap.Float64("duration_ms", duration),
      zap.String("ip", getClientIP(r)),
    }
    if rw.statusCode >= 400 {
      logger.Warn("http request", fields...)
    } else {
      logger.Info("http request", fields...)
    }
  })
}


# go  # golang  # 字节  # ai  # 状态码  # red  # 中间件  # String  # if  # for  # 封装  # Error  # Token  # 字符串  # 结构体  # int  # 接口  # http  # 结构化  # 自定义  # 重写  # 是一个  # 如有  # 可直接  # 时应  # 必填  # 退到  # 按需 


相关文章: JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  建站之星会员如何解锁更多建站功能?  建站之星备案流程有哪些注意事项?  如何选择可靠的免备案建站服务器?  网站制作软件有哪些,制图软件有哪些?  Python路径拼接规范_跨平台处理说明【指导】  如何在IIS中配置站点IP、端口及主机头?  股票网站制作软件,网上股票怎么开户?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  如何通过IIS搭建网站并配置访问权限?  建站主机CVM配置优化、SEO策略与性能提升指南  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  如何选择网络建站服务器?高效建站必看指南  制作企业网站建设方案,怎样建设一个公司网站?  如何通过主机屋免费建站教程十分钟搭建网站?  如何配置支付宝与微信支付功能?  建站之星后台管理如何实现高效配置?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  如何在Ubuntu系统下快速搭建WordPress个人网站?  PHP正则匹配日期和时间(时间戳转换)的实例代码  建站之星代理费用多少?最新价格详情介绍  如何通过免费商城建站系统源码自定义网站主题与功能?  香港服务器选型指南:免备案配置与高效建站方案解析  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  如何通过远程VPS快速搭建个人网站?  广州美橙建站如何快速搭建多端合一网站?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  已有域名和空间,如何快速搭建网站?  如何获取上海专业网站定制建站电话?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  建站之星后台密码遗忘或太弱?如何重置与强化?  建站VPS配置与SEO优化指南:关键词排名提升策略  如何选择美橙互联多站合一建站方案?  北京制作网站的公司,北京铁路集团官方网站?  威客平台建站流程解析:高效搭建教程与设计优化方案  制作电商网页,电商供应链怎么做?  如何在建站之星绑定自定义域名?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何快速搭建虚拟主机网站?新手必看指南  建站之星如何配置系统实现高效建站?  招贴海报怎么做,什么是海报招贴?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  如何通过西部数码建站助手快速创建专业网站?  网站制作的步骤包括,正确网址格式怎么写?  c# await 一个已经完成的Task会发生什么  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  如何批量查询域名的建站时间记录?  如何选择最佳自助建站系统?快速指南解析优劣  移民网站制作流程,怎么看加拿大移民官网?  如何快速搭建个人网站并优化SEO? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。