@max7z
programmer

Как в Django обрабатывать все (в том числе и из других потоков) исключения?

Мне требуется логировать все ошибки, которые случились в проекте. Особенно те, которые произошли в других потоках.

В flask это делается через указания обработчика ошибок:

app.register_error_handler(Exception, _error_handler)

def _error_handler(error):
  log.exception(error)


Чего-то подобного в django я не нашел. Решил сделать это через middleware:

# middleware.py:
class LoggingExceptionMiddleware(MiddlewareMixin):
    def process_exception(self, request, exception):
        logger.error('LoggingExceptionMiddleware.process_exception was called')
        logger.exception(exception)


# views.py
def exception(request):
    raise Exception('bla bla')


def exception_in_new_thread(request):
    logger.debug('exception_in_new_thread called')
    Thread(target=buggy_func).start()
    return HttpResponse('ok')


def buggy_func():
    logger.debug('buggy_func called')
    sleep(5)
    raise Exception('hi from buggy_func')


Но этот побдход не сработал. Если ошибка случается в потоке джанги (def exception), то миддлварь срабатывает. Но если же в другом потоке (exception_in_new_thread), то ошибка не ловится.

Как вы логируете _ВСЕ_ исключения, что случаются в проекте?
  • Вопрос задан
  • 702 просмотра
Пригласить эксперта
Ответы на вопрос 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Чего-то подобного в django я не нашел.

Плохо искали.

Если ошибка случается в потоке джанги (def exception), то миддлварь срабатывает. Но если же в другом потоке (exception_in_new_thread), то ошибка не ловится.

Django разработан синхронным и однопоточным. Потоки в нём использовать не стоит.
Ответ написан
Комментировать
alternativshik
@alternativshik
+ ко всему выше написанному https://docs.djangoproject.com/en/2.2/topics/logging/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы