Let the developer use their own logger to Recovery middleware

Before

func CustomRecoveryWithWriter(out io.Writer, handle RecoveryFunc) HandlerFunc {
    var logger *log.Logger

After

func CustomRecoveryWithWriter(out io.Writer, logger *log.Logger, handle RecoveryFunc) HandlerFunc {

Comment From: bbdshow

"CustomRecoveryWithWriter" is a HandlerFunc. You can use custom HandlerFunc eg: I..RecoveryWithWriter(xxx) HandlerFunc{}.

eg

// RecoveryLogger GIN Recovery logging to qelog
func RecoveryLogger() gin.HandlerFunc {
    if logs.Qezap != nil {
        return gin.RecoveryWithWriter(logs.Qezap.NewWriter(zap.ErrorLevel, "GIN-ERROR"))
    }
    return gin.Recovery()
}

func DefaultEngine(flags int) *gin.Engine {

    if flags&MRelease != 0 {
        gin.SetMode(gin.ReleaseMode)
    }
    engine := gin.New()

    healthHandler(engine)

    // swagger
    if flags&MSwagger != 0 {
        engine.GET("/docs/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
    }

    // middleware
    if flags&MTraceId != 0 {
        engine.Use(ContextWithTraceId())
    }
    if flags&MReqLogger != 0 {
        engine.Use(ReqLogger(skipPaths...))
    }
    if flags&MDumpBody != 0 {
        engine.Use(DumpBodyLogger(skipPaths...))
    }
    if flags&MRecoverLogger != 0 {
        engine.Use(RecoveryLogger())
    }

    if flags&MPprof != 0 {
        pprofHandler(engine)
    }

    return engine
}