Вход в систему flask по-прежнему выводится на стандартный вывод, хотя я удалил stream_handler - PullRequest
0 голосов
/ 06 августа 2020

У меня есть веб-приложение, которое работает 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
...