尽管我删除了stream_handler

时间:2020-08-06 19:24:12

标签: python flask logging

我有一个在docker中运行flask的webapp。
在烧瓶中,我正在使用记录仪。
我为记录器设置了多个处理程序(例如file_handler,stream_handler等)。 为了进行测试,我然后删除了所有处理程序。我还删除了default_handler(请参见here

根据here,如果根记录器未配置处理程序,Werkzeug将StreamHandler添加到其记录器中。
所以我也将处理程序删除到Werkzeug记录器中。

但是我仍然看到标准输出中的打印输出(例如INFO:app:foo3) 这怎么会发生?

谢谢,
阿维


p.s。
note1
如果不删除StreamHandler,我会按预期在标准输出中看到另一行(格式化):
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')

#查看标准输出中的日志消息-即使记录程序处理程序列表为空,也会显示 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

0 个答案:

没有答案