package middlewares import ( "fmt" "net/http" "runtime/debug" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" ) func GinRecoveryWithLogrus(logger *logrus.Logger) gin.HandlerFunc { return func(c *gin.Context) { defer func() { if r := recover(); r != nil { // ambil message dari panic var message string switch v := r.(type) { case string: message = v case error: message = v.Error() default: message = fmt.Sprintf("%v", v) } logger.WithFields(logrus.Fields{ "panic": r, "stack": string(debug.Stack()), "path": c.Request.URL.Path, "method": c.Request.Method, }).Error("Recovered from panic in HTTP request") c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{ "status": false, "error": "Internal Server Error", "message": message, }) } }() c.Next() } }