我有一个在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