竹简文档

辅助中间件

HTTP 日志记录与 Panic 恢复

辅助中间件

Bamboo Base 提供了两个辅助中间件:HTTP 请求日志和 Panic 恢复。

HttpLogger

HTTP 请求日志中间件,记录请求的详细信息。

功能特性

  • 双阶段日志:请求开始和请求完成分别记录
  • 调试模式增强:调试模式下记录更多详细信息
  • 敏感信息脱敏:自动脱敏密码、Token 等敏感字段
  • 智能日志级别:根据响应状态码自动调整日志级别

使用方式

import xHelper "github.com/bamboo-services/bamboo-base-go/helper"

r := gin.New()
r.Use(xHelper.HttpLogger())

日志级别规则

状态码日志级别
2xx/3xxINFO
4xxWARN
5xxERROR

请求开始日志

基础信息(始终记录):

  • method: 请求方法
  • path: 请求路径
  • client_ip: 客户端 IP

调试模式额外信息:

  • query: 查询参数
  • headers: 请求头(已脱敏)
  • body: 请求体(已脱敏)

请求完成日志

调试模式下记录:

  • status: 响应状态码
  • latency_ms: 请求耗时(毫秒)
  • client_ip: 客户端 IP

敏感信息脱敏

请求头脱敏

处理方式字段
完全移除Set-Cookie
中间隐藏Authorization, Cookie, X-API-Key, Access-Token

请求体脱敏

自动脱敏的 JSON 字段:

  • password, passwd
  • token, secret
  • apikey, api_key, x-api-key
  • access_token, refresh_token
  • old_password, new_password, confirm_password

脱敏规则

// 短值(≤6字符):全部隐藏
"abc""******"

// 长值:保留首尾各3字符
"mySecretToken123""myS...123"

PanicRecovery

全局 Panic 恢复中间件,捕获处理过程中的 Panic 并返回统一错误响应。

功能特性

  • Panic 捕获:捕获所有未处理的 Panic
  • 统一响应:返回标准 JSON 格式错误响应
  • 错误码提取:从上下文提取错误码信息
  • 日志记录:记录 Panic 详细信息

使用方式

import xHelper "github.com/bamboo-services/bamboo-base-go/helper"

r := gin.New()
r.Use(xHelper.PanicRecovery())
r.Use(xHelper.HttpLogger()) // 建议放在 PanicRecovery 之后

错误码提取

中间件会尝试从上下文获取错误信息:

  1. ErrorCodeKey: 错误码(*xError.ErrorCode
  2. ErrorMessageKey: 错误描述

如果未找到,使用默认值:

  • 错误码:xError.ServerInternalError
  • 错误描述:"未知错误,请稍后再试"

响应格式

{
  "context": "trace-id-xxx",
  "output": "ServerInternalError",
  "code": 50000,
  "message": "服务器内部错误",
  "errorMessage": "具体错误描述"
}

日志输出

xLog.WithName(xLog.NamedMIDE).Error(ctx, "Panic 恢复",
    slog.Uint64("code", errorCode.Code),
    slog.String("output", errorCode.GetOutput()),
    slog.String("message", errorCode.GetMessage()),
    slog.String("errorMessage", errMessage),
)

中间件顺序

推荐的中间件注册顺序:

r := gin.New()

// 1. Panic 恢复(最先注册,确保能捕获所有 Panic)
r.Use(xHelper.PanicRecovery())

// 2. HTTP 日志(记录请求信息)
r.Use(xHelper.HttpLogger())

// 3. CORS 跨域
r.Use(xMiddleware.Cors())

// 4. 资源注入(数据库、Redis 等)
r.Use(InjectMiddleware(db, rdb, node))

// 5. 业务中间件
r.Use(AuthMiddleware())

完整示例

package main

import (
    "github.com/gin-gonic/gin"
    xHelper "github.com/bamboo-services/bamboo-base-go/helper"
    xMiddleware "github.com/bamboo-services/bamboo-base-go/middleware"
)

func main() {
    r := gin.New()

    // 注册中间件
    r.Use(xHelper.PanicRecovery())
    r.Use(xHelper.HttpLogger())
    r.Use(xMiddleware.Cors())

    // 路由
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{"message": "pong"})
    })

    // 测试 Panic 恢复
    r.GET("/panic", func(c *gin.Context) {
        panic("测试 Panic")
    })

    r.Run(":8080")
}

下一步

On this page