// Package recover provides recovery for specific routes or for the whole app via middleware. See _examples/miscellaneous/recover package recover import ( "fmt" "runtime" "strconv" "github.com/kataras/iris/v12/context" ) func getRequestLogs(ctx context.Context) string { var status, ip, method, path string status = strconv.Itoa(ctx.GetStatusCode()) path = ctx.Path() method = ctx.Method() ip = ctx.RemoteAddr() // the date should be logged by iris' Logger, so we skip them return fmt.Sprintf("%v %s %s %s", status, path, method, ip) } // New returns a new recover middleware, // it recovers from panics and logs // the panic message to the application's logger "Warn" level. func New() context.Handler { return func(ctx context.Context) { defer func() { if err := recover(); err != nil { if ctx.IsStopped() { return } var stacktrace string for i := 1; ; i++ { _, f, l, got := runtime.Caller(i) if !got { break } stacktrace += fmt.Sprintf("%s:%d\n", f, l) } // when stack finishes logMessage := fmt.Sprintf("Recovered from a route's Handler('%s')\n", ctx.HandlerName()) logMessage += fmt.Sprintf("At Request: %s\n", getRequestLogs(ctx)) logMessage += fmt.Sprintf("Trace: %s\n", err) logMessage += fmt.Sprintf("\n%s", stacktrace) ctx.Application().Logger().Warn(logMessage) ctx.StatusCode(500) ctx.StopExecution() } }() ctx.Next() } }