2 Star 2 Fork 0

sdxstar / air

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
recovery.go 1.82 KB
一键复制 编辑 原始数据 按行查看 历史
wangcheng 提交于 2021-08-23 18:13 . 1. client移到单独包
package middleware
import (
"fmt"
"runtime"
"gitee.com/sdxstar/air"
)
type (
// RecoverConfig defines the config for Recover middleware.
RecoverConfig struct {
// Skipper defines a function to skip middleware.
Skipper Skipper
// Size of the stack to be printed.
// Optional. Default value 4KB.
StackSize int `yaml:"stack_size"`
// DisableStackAll disables formatting stack traces of all other goroutines
// into buffer after the trace for the current goroutine.
// Optional. Default value false.
DisableStackAll bool `yaml:"disable_stack_all"`
// DisablePrintStack disables printing stack trace.
// Optional. Default value as false.
DisablePrintStack bool `yaml:"disable_print_stack"`
}
)
var (
// DefaultRecoverConfig is the default Recover middleware config.
DefaultRecoverConfig = RecoverConfig{
Skipper: DefaultSkipper,
StackSize: 4 << 10, // 4 KB
DisableStackAll: false,
DisablePrintStack: false,
}
)
func Recover() air.MiddlewareFunc {
return RecoverWithConfig(DefaultRecoverConfig)
}
func RecoverWithConfig(config RecoverConfig) air.MiddlewareFunc {
// Defaults
if config.Skipper == nil {
config.Skipper = DefaultRecoverConfig.Skipper
}
if config.StackSize == 0 {
config.StackSize = DefaultRecoverConfig.StackSize
}
return func(next air.EventHandler) air.EventHandler {
return func(c air.Context) error {
if config.Skipper(c) {
return next(c)
}
defer func() {
if r := recover(); r != nil {
err, ok := r.(error)
if !ok {
err = fmt.Errorf("%v", r)
}
stack := make([]byte, config.StackSize)
length := runtime.Stack(stack, !config.DisableStackAll)
if !config.DisablePrintStack {
msg := fmt.Sprintf("[PANIC RECOVER] %v %s\n", err, stack[:length])
c.Logger().Error(msg)
}
}
}()
return next(c)
}
}
}
1
https://gitee.com/sdxstar/air.git
git@gitee.com:sdxstar/air.git
sdxstar
air
air
v0.5.5

搜索帮助

53164aa7 5694891 3bd8fe86 5694891