У меня есть веб-приложение, которое работает flask внутри docker. В flask я использую регистратор. Я установил регистратор с несколькими обработчиками (например, file_handler, stream_handler, et c ..) Затем для тестирования я удаляю все обработчики. Я также удаляю default_handler (см. здесь )
Согласно здесь Если регистратор root не имеет настроенных обработчиков, Werkzeug добавляет StreamHandler к своему регистратору. Поэтому я также удаляю обработчик регистратора Werkzeug.
Но я все еще вижу распечатки в стандартном выводе (например, INFO:app:foo3
). Как это может произойти?
Спасибо, Ави
пс примечание1 Если я не удаляю StreamHandler, я вижу другую строку (отформатированную) в stdout, как и ожидалось: 2020-08-06 19:03:11,708 INFO: foo4 [in /usr/src/app/web/app/api/sites.py:274]
(но строка «INFO: app: foo4» все еще отображается)
note2 печать foo1
, которая использует ту же самую команду регистратора: current_app.logger.info('foo1')
отфильтровывается при вызове из app / init .py, из create_app (), но не при вызове из файла app / api /sites.py
# код для настройки логгера
cat app/__init__.py
import logging
from logging.handlers import SMTPHandler, RotatingFileHandler
from flask.logging import default_handler
...
def create_app(config_class=Config):
...
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s '
'[in %(pathname)s:%(lineno)d]')
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
stream_handler.setLevel(logging.INFO)
app.logger.addHandler(stream_handler)
print( 'app.logger.handlers', app.logger.handlers )
app.logger.removeHandler(app.logger.handlers[0])
app.logger.removeHandler(app.logger.handlers[0])
app.logger.removeHandler(app.logger.handlers[0])
app.logger.removeHandler(default_handler)
print( 'app.logger.handlers after removal of handlers', app.logger.handlers )
app.logger.setLevel(logging.DEBUG)
...
app.app_context().push()
current_app.logger.info('foo1')
# распечатать сообщение журнала с помощью регистратора
cat app/api/sites.py
...
@bp.route('/api/v1_2/foo3', methods=['POST'])
def foo3(group_id = 1):
print( 'current_app.logger.handlers', current_app.logger.handlers )
current_app.logger.info('foo3')
werkzeug_logger = logging.getLogger('werkzeug')
werkzeug_logger.setLevel(logging.ERROR)
print( 'werkzeug_logger.handlers', werkzeug_logger.handlers )
werkzeug_logger.removeHandler(werkzeug_logger.handlers[0])
print( 'werkzeug_logger.handlers2', werkzeug_logger.handlers )
current_app.logger.info('foo4')
# просматривать сообщения журнала в stdout - INFO: app: foo3 отображаются, даже если список обработчиков журналов пуст
docker logs -f webserver_web_1
...
app.logger.handlers [<NullHandler (NOTSET)>, <SSLSMTPHandler (ERROR)>, <StreamHandler <stderr> (INFO)>]
app.logger.handlers after removal of handlers []
...
current_app.logger.handlers []
INFO:app:foo3
werkzeug_logger.handlers [<StreamHandler <stderr> (NOTSET)>]
werkzeug_logger.handlers2 []
INFO:app:foo4