Django сбоев при рекурсивном ведении журнала Python 3 интерпретатора, глотая логи - PullRequest
4 голосов
/ 30 января 2020

Во время нагрузочного тестирования ветки Python 3 нашего приложения я заметил следующие записи в журнале, указывающие, что достигнута максимальная глубина рекурсии, что привело к перезапуску интерпретатора. Это приводит к значительному снижению производительности и отбрасыванию запросов.

WARNING [reader.views] Initializing library objects.
INFO [multiserver] Initializing ServerCoordinator with subscriptions: ['msync']
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
Error: maximum recursion depth exceeded

При рассмотрении проблемы я заметил этот другой вопрос SO , который, как мне кажется, описывает нашу ситуацию (у нас нет проблема с нашим Python 2 кодом), и этот вопрос привел к ЭТОМУ отчету об ошибках и ЭТОМУ патчу .

Моя непосредственная цель - убедиться, что Информация об ошибках и трассировке стека регистрируется правильно, поэтому мы можем отследить эту проблему. Согласно источнику Python 3, после Logging Error должно быть намного больше информации, но эта информация полностью опущена. Я проследил основной код Python, ответственный за эти журналы, до этой handleError функции , где мы можем увидеть вышеупомянутый патч. Мне кажется, что внешний блок try генерирует исключение, которое впоследствии проглатывается.


Что я пробовал до сих пор:

  • Убедитесь, что для raiseExceptions установлено значение True. Без изменений.

  • Я использовал find_recursionlimit.py script в репо Python 3, чтобы найти реальный предел глубины рекурсии нашей системы, и изменил его по умолчанию от 1000 до 11800. Без изменений.

  • Ограничена сложность настроек LOGGING, удаления пользовательских обработчиков и фильтров. Без изменений.


Что я рассматриваю или активно работаю над:

  • Исправление функции handleError для поднять исключения во внешнем блоке try
  • Оборачивая пакет logging, чтобы попытаться произвести то же самое изменение

Дополнительная информация

  • Django 1.11
  • Python 3.7
  • Конфигурация регистрации LINK
...