From 330f7c880d3277217bfdd9513d70c6b79e7f2808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Sun, 4 Jan 2026 11:44:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=85=A8=E5=B1=80=20?= =?UTF-8?q?panic=20=E6=8D=95=E8=8E=B7=E7=9A=84=E4=B8=AD=E9=97=B4=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logger/instance.go | 1 + middleware/custom_recover.go | 37 ++++++++++++++++++++++++++++++++++++ router/server.go | 2 ++ 3 files changed, 40 insertions(+) create mode 100644 middleware/custom_recover.go diff --git a/logger/instance.go b/logger/instance.go index 352a938..aa37af4 100644 --- a/logger/instance.go +++ b/logger/instance.go @@ -53,4 +53,5 @@ const ( CodeLogicErrorWrapper = "logic-error-wrapper" CodeLogicSseInitError = "sse-init-error" CodeLogicSseClosedError = "sse-closed-error" + CodeServicePanic = "service-panic" // 服务发生 panic ) diff --git a/middleware/custom_recover.go b/middleware/custom_recover.go new file mode 100644 index 0000000..abed5e1 --- /dev/null +++ b/middleware/custom_recover.go @@ -0,0 +1,37 @@ +// Package middleware ... +// +// Description : middleware ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 2026-01-04 11:28 +package middleware + +import ( + "net/http" + + "git.zhangdeman.cn/zhangdeman/exception" + "git.zhangdeman.cn/zhangdeman/gin/define" + "git.zhangdeman.cn/zhangdeman/gin/logger" + "git.zhangdeman.cn/zhangdeman/gin/response" + "git.zhangdeman.cn/zhangdeman/gin/util" + pkgLogger "git.zhangdeman.cn/zhangdeman/logger" + "github.com/gin-gonic/gin" +) + +func CustomRecover() gin.HandlerFunc { + // 自定义 panic 捕获, 固定规则, 直接内置, 不暴露配置项 + return gin.CustomRecovery(func(c *gin.Context, err any) { + logger.Instance.Error("服务发生panic被捕获,请检查日志", pkgLogger.NewLogData(util.GinCtxToContext(c), logger.RecordType, logger.CodeServicePanic, map[string]any{ + "err": err, + }).ToFieldList()...) + response.SendWithException(c, exception.New(http.StatusInternalServerError, map[string]any{ + "info": "Server Error", + }), &define.ResponseOption{ + Extension: map[string]any{ + "err": err, + }, + }) + c.Abort() + }) +} diff --git a/router/server.go b/router/server.go index db4aae1..7ac12bc 100644 --- a/router/server.go +++ b/router/server.go @@ -115,6 +115,8 @@ type server struct { func (s *server) getGlobalMiddlewareList(option *serverOption) []gin.HandlerFunc { globalMiddlewareList := make([]gin.HandlerFunc, 0) + // 全局 panic 捕获 + globalMiddlewareList = append(globalMiddlewareList, middleware.CustomRecover()) if nil != option.initContextData { globalMiddlewareList = append(globalMiddlewareList, option.initContextData) // 初始化一些全局的变量 }