全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-18 5 分钟 ✍️ juanwangdev

Gin默认中间件

Gin 提两个默认中间件,简化常见功能配置。

gin.Default() 默认中间件

Go
r := gin.Default() // 默认包含 Logger 和 Recovery 中间件

// 等价于
r := gin.New()
r.Use(gin.Logger())
r.Use(gin.Recovery())

gin.New() 无中间件

Go
r := gin.New() // 不包含任何中间件,需要手动添加

Logger 中间件

默认日志中间件,记录请求信息:

Go
func main() {
    r := gin.Default()

    // Logger 自动记录:
    // [GIN] 2026/05/18 - 10:00:00 | 200 |   2.5ms | 127.0.0.1 | GET     "/api/users"

    r.GET("/ping", func(c *gin.Context) {
        c.String(200, "pong")
    })

    r.Run(":8080")
}

自定义 Logger 格式

Go
func customLogger() gin.HandlerFunc {
    return gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
        return fmt.Sprintf("[GIN] %v | %d | %v | %s | %s %s \n",
            param.TimeStamp.Format("2006-01-02 15:04:05"),
            param.StatusCode,
            param.Latency,
            param.ClientIP,
            param.Method,
            param.Path,
        )
    })
}

r := gin.New()
r.Use(customLogger())

禁用特定路径日志

Go
func skipLogger() gin.HandlerFunc {
    return gin.LoggerWithWriter(gin.DefaultWriter, "/health", "/metrics")
}

r.Use(skipLogger())

Recovery 中间件

异常恢复中间件,捕获 panic 避免 panic 中断整个程序:

Go
func main() {
    r := gin.Default()

    r.GET("/panic", func(c *gin.Context) {
        panic("something went wrong") // Recovery 会捕获
    })

    // Recovery 捕获后返回 500 状态码,程序继续运行
    r.Run(":8080")
}

自定义 Recovery

Go
func customRecovery() gin.HandlerFunc {
    return gin.CustomRecovery(func(c *gin.Context, err interface{}) {
        c.JSON(500, gin.H{
            "code":    500,
            "message": "服务器内部错误",
            "error":   fmt.Sprintf("%v", err),
        })
    })
}

r := gin.New()
r.Use(customRecovery())

自定义默认中间件组合

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

    // 自定义中间件组合
    r.Use(customLogger())
    r.Use(customRecovery())
    r.Use(corsMiddleware()) // 添加 CORS

    r.GET("/api", handler)

    r.Run(":8080")
}

中间件对比

方法包含中间件使用场景
gin.Default()Logger + Recovery开发、生产默认
gin.New()自定义配置

生产环境配置

Go
func main() {
    gin.SetMode(gin.ReleaseMode) // 设置生产模式

    r := gin.New()
    r.Use(gin.Logger())
    r.Use(gin.Recovery())

    // 业务路由
    r.GET("/api/users", listUsers)

    r.Run(":8080")
}

生产环境必须启用 Recovery,防止 panic 导致服务崩溃。

要点总结

  • gin.Default() 自动加载 Logger 和 Recovery
  • gin.New() 无中间件,需手动添加
  • Logger 记录请求日志,Recovery 捕获 panic
  • 可自定义日志格式和异常处理逻辑
  • 生产环境必须启用 Recovery 保证服务稳定

📝 发现内容有误?点击此处直接编辑

← 上一篇 静态文件服务
下一篇 → 中间件中的c.Next()与c.Abort()
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库