Как заставить SQLAlchemy и Flask использовать один и тот же регистратор?

Возможно, я не совсем понимаю, как на самом деле работает ведение журнала в Python. Я пытаюсь отладить приложение Flask + SQLAlchemy (но без flask_sqlalchemy), которое таинственным образом зависает на некоторых запросах только при запуске из Apache, поэтому мне нужно вести надлежащий журнал, чтобы получить значимую информацию. Приложение Flask по умолчанию поставляется с хорошим регистратором + обработчиком, но как мне заставить SQLAlchemy использовать тот же регистратор?

Раздел «Настройка ведения журнала» в SQLAlchemy просто объясняет, как включить ведение журнала в целом, но не объясняет, как «подключить» вывод журнала SQLAlchemy к уже существующему регистратору.

Некоторое время я смотрел на Flask + расширенное ведение журнала sqlalchemy с пустым, невыразительным лицом. Понятия не имею, есть ли там ответ на мой вопрос.

Обновлено: Благодаря полученному ответу я теперь знаю, что два регистратора могут использовать один и тот же обработчик. Теперь, конечно, мой журнал ошибок apache завален сотнями строк повторяющихся SQL-вызовов. Я хотел бы регистрировать только сообщения об ошибках в журнале httpd и перенаправлять все данные нижнего уровня в отдельный файл журнала. См. Код ниже. Тем не менее, я все еще получаю каждое сообщение об отладке в журнале http. Почему?

if app.config['DEBUG']:
    # Make logger accept all log levels
    app.logger.setLevel(logging.DEBUG)
    for h in app.logger.handlers:
        # restrict logging to /var/log/httpd/error_log to errors only
        h.setLevel(logging.ERROR)
    if app.config['LOGFILE']:
        # configure debug logging only if logfile is set
        debug_handler = logging.FileHandler(app.config['LOGFILE'])
        debug_handler.setLevel(logging.DEBUG)
        app.logger.addHandler(debug_handler)
        # get logger for SQLAlchemy
        sq_log = logging.getLogger('sqlalchemy.engine')
        sq_log.setLevel(logging.DEBUG)
        # remove any preconfigured handlers there might be
        for h in sq_log.handlers:
            sq_log.removeHandler(h)
            h.close()
        # Now, SQLAlchemy should not have any handlers at all. Let's add one
        # for the logfile
        sq_log.addHandler(debug_handler)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
704
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы не можете make SQLAlchemy and Flask use the same logger, но вы можете заставить их писать в одно место, добавив общий обработчик. И, возможно, эта статья будет полезной: https://www.electricmonk.nl/log/2017/08/06/understanding-pythons-logging-module/

Кстати, если вы хотите получить все журналы в одном запросе, вы можете установить имя uniq для текущего потока перед запросом и добавить threadName в модуль форматирования журналов.

Ответ на мой вопрос в EDIT: у меня все еще было установлено «echo = True» в create_engine, поэтому я видел весь дополнительный вывод на stderr. echo = False останавливает это, но по-прежнему регистрирует уровень отладки DEBUG.

Очистите все соответствующие обработчики, созданные SqlAlchemy:

logging.getLogger("sqlalchemy.engine.Engine").handlers.clear()

Приведенный выше код следует вызывать после создания движка.

Другие вопросы по теме