diff --git a/api/http/middlewares/panic_logger.go b/api/http/middlewares/panic_logger.go new file mode 100644 index 000000000..6f3b2076f --- /dev/null +++ b/api/http/middlewares/panic_logger.go @@ -0,0 +1,25 @@ +package middlewares + +import ( + "net/http" + "runtime/debug" + + "github.com/rs/zerolog/log" +) + +func WithPanicLogger(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + defer func() { + if err := recover(); err != nil { + log.Error(). + Any("panic", err). + Str("method", req.Method). + Str("url", req.URL.String()). + Str("stack", string(debug.Stack())). + Msg("Panic in request handler") + } + }() + + next.ServeHTTP(w, req) + }) +} diff --git a/api/http/server.go b/api/http/server.go index 3dcc84d2d..12925d479 100644 --- a/api/http/server.go +++ b/api/http/server.go @@ -335,7 +335,7 @@ func (server *Server) Start() error { handler := adminMonitor.WithRedirect(offlineGate.WaitingMiddleware(time.Minute, server.Handler)) - handler = middlewares.WithSlowRequestsLogger(handler) + handler = middlewares.WithPanicLogger(middlewares.WithSlowRequestsLogger(handler)) handler, err := csrf.WithProtect(handler) if err != nil {