diff --git a/app/brahma/api/murder/main.go b/app/brahma/api/murder/main.go index fa2af3e..03763ac 100755 --- a/app/brahma/api/murder/main.go +++ b/app/brahma/api/murder/main.go @@ -52,9 +52,9 @@ func appInit() { //requestId app.Use(requestid.New()) //recover - app.Use(api.FibberRecover) + app.Use(api.FibberRecoverHandler) //requestId for gorm - app.Use(api.FibberUserCtxWithTrace) + app.Use(api.FibberUserCtxWithTraceHandler) } func routerInit() { diff --git a/pkg/api/fiber.go b/pkg/api/fiber.go index fa2e25e..9cb5efa 100644 --- a/pkg/api/fiber.go +++ b/pkg/api/fiber.go @@ -3,7 +3,12 @@ package api import ( "context" + "fmt" "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/recover" + ctxLogger "github.com/luizsuper/ctxLoggers" + "go.uber.org/zap" + "runtime" ) // FiberErrHandler fiber 错误处理的中间件 @@ -28,6 +33,11 @@ func FiberErrHandler(ctx *fiber.Ctx, err error) error { // FibberRespHandler fiber resp的统一处理 func FibberRespHandler(c *fiber.Ctx) error { + err := c.Next() + if err != nil { + return err + } + if respContentType := string(c.Response().Header.ContentType()); respContentType == fiber.MIMEApplicationJSON { resp := Response{ Code: 0, @@ -40,22 +50,21 @@ func FibberRespHandler(c *fiber.Ctx) error { return c.Next() } -// FibberRecover fiberPanicRecover -func FibberRecover(c *fiber.Ctx) error { - if respContentType := string(c.Response().Header.ContentType()); respContentType == fiber.MIMEApplicationJSON { - resp := Response{ - Code: 0, - Message: "", - Data: c.Response().Body(), - } - return c.JSON(resp) - } - - return c.Next() +// FibberRecoverHandler fiberPanicRecover +func FibberRecoverHandler() fiber.Handler { + return recover.New(recover.Config{ + EnableStackTrace: true, + StackTraceHandler: func(c *fiber.Ctx, e interface{}) { + buf := make([]byte, 1024*1024) + buf = buf[:runtime.Stack(buf, false)] + fmt.Printf("panic: %v\n%s\n", e, buf) + ctxLogger.FError(c, "panic", zap.String("", fmt.Sprintf("panic: %v\n%s\n", e, buf))) + }, + }) } -// FibberUserCtxWithTrace 把fibberCtx的traceId 置入UserCtx中 -func FibberUserCtxWithTrace(c *fiber.Ctx) error { +// FibberUserCtxWithTraceHandler 把fibberCtx的traceId 置入UserCtx中 +func FibberUserCtxWithTraceHandler(c *fiber.Ctx) error { c.SetUserContext(context.WithValue(context.Background(), fiber.HeaderXRequestID, c.Response().Header.Peek(fiber.HeaderXRequestID))) return c.Next() }