辅助中间件
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/3xx | INFO |
| 4xx | WARN |
| 5xx | ERROR |
请求开始日志
基础信息(始终记录):
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,passwdtoken,secretapikey,api_key,x-api-keyaccess_token,refresh_tokenold_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 之后错误码提取
中间件会尝试从上下文获取错误信息:
ErrorCodeKey: 错误码(*xError.ErrorCode)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")
}