Возможно, я не совсем понимаю, как на самом деле работает ведение журнала в 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)
Вы не можете 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()
Приведенный выше код следует вызывать после создания движка.