Go-Gin全局错误处理中间件

为了防止报错引起Gin服务挂掉以及错误日志记录,我们使用全局错误中间件进行管理。

go 复制代码
package middleware

import (
	"ToDoList/global"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"net"
	"net/http"
	"net/http/httputil"
	"os"
	"runtime/debug"
	"strings"
)

// GinRecovery recover掉项目可能出现的panic,并使用zap记录相关日志
func GinRecovery(stack bool) gin.HandlerFunc {
	return func(c *gin.Context) {
		defer func() {
			if err := recover(); err != nil {
				var brokenPipe bool
				// 如果是连接错误并且错误信息中包含"broken pipe"或"connection reset by peer",则认为是客户端断开连接导致的错误。
				if ne, ok := err.(*net.OpError); ok {
					if se, ok := ne.Err.(*os.SyscallError); ok {
						if strings.Contains(strings.ToLower(se.Error()), "broken pipe") || strings.Contains(strings.ToLower(se.Error()), "connection reset by peer") {
							brokenPipe = true
						}
					}
				}
				//如果brokenPipe为true,表明客户端断开连接导致的错误,则使用zap记录相关日志,并将错误信息作为错误返回给客户端。
				httpRequest, _ := httputil.DumpRequest(c.Request, false)
				if brokenPipe {
					global.GVA_LOG.Error(c.Request.URL.Path,
						zap.Any("error", err),
						zap.String("request", string(httpRequest)),
					)

					_ = c.Error(err.(error))
					c.Abort()
					return
				}
				//如果stack为true,则使用debug.Stack()函数获取堆栈信息,并使用zap记录相关日志。
				if stack {
					global.GVA_LOG.Error("[Recovery from panic]",
						zap.Any("error", err),
						zap.String("request", string(httpRequest)),
						zap.String("stack", string(debug.Stack())),
					)
				} else {
					global.GVA_LOG.Error("[Recovery from panic]",
						zap.Any("error", err),
						zap.String("request", string(httpRequest)),
					)
				}
				//发生错误中止当前请求并返回500状态码。
				c.AbortWithStatus(http.StatusInternalServerError)
			}
		}()
		c.Next()
	}
}
相关推荐
张人玉2 分钟前
C# 串口通讯中 SerialPort 类的关键参数和使用方法
开发语言·c#·串口通讯
白山云北诗13 分钟前
网站被攻击了怎么办?如何进行DDoS防御?
开发语言·网络安全·php·ddos·防ddos·防cc
程序定小飞34 分钟前
基于springboot的作业管理系统设计与实现
java·开发语言·spring boot·后端·spring
Jonathan Star39 分钟前
NestJS 是基于 Node.js 的渐进式后端框架,核心特点包括 **依赖注入、模块化架构、装饰器驱动、TypeScript 优先、与主流工具集成** 等
开发语言·javascript·node.js
晓庆的故事簿41 分钟前
windows下载和使用minio,结合java和vue上传文件
java·开发语言
猫头虎1 小时前
永久免费白嫖多个域名,一键托管Cloudflare,免费申请SSL加密证书,轻松建站、搭建线路伪装
服务器·开发语言·网络·数据库·python·网络协议·ssl
无敌最俊朗@2 小时前
C++后端总览
开发语言
多喝开水少熬夜2 小时前
堆相关算法题基础-java实现
java·开发语言·算法
7澄12 小时前
Java 集合框架:List 体系与实现类深度解析
java·开发语言·vector·intellij-idea·集合·arraylist·linkedlist
mit6.8242 小时前
一些C++的学习资料备忘
开发语言·c++