为什么Flask在没有添加流处理程序的情况下仍然将日志信息打印到控制台



我在logger.py中定义了一个记录器:

def my_logger(module_name):
logger = logging.getLogger(module_name)
logger.setLevel(logging.DEBUG)
# stream handler

# debug handler
f1_handler = logging.handlers.RotatingFileHandler(os.path.join(abspath, "logs/debug.log"))
f1_handler.setLevel(logging.DEBUG)
f1_handler.setFormatter(format)
# warning handler
f3_handler = logging.handlers.RotatingFileHandler(os.path.join(abspath, "logs/warning.log"))
f3_handler.setLevel(logging.WARNING)
f3_handler.setFormatter(format)
# error handler
f4_handler = logging.handlers.RotatingFileHandler(os.path.join(abspath, "logs/error.log"))
f4_handler.setLevel(logging.ERROR)
f4_handler.setFormatter(format)
# Add handlers to the logger

logger.addHandler(f1_handler)
logger.addHandler(f3_handler)
logger.addHandler(f4_handler)
return logger

然后在我的test.py中,我可以将记录器测试为test.py:

from kg import logger
logger = logger.my_logger(__name__)
if __name__ == "__main__":
logger.info('Start main ...')

这正如预期的那样工作,logger消息只进入我的logs/debug.log下的debug.log文件,这意味着它不会将消息打印到控制台。

然而,如果我在Flask应用程序中测试它,并且在浏览器中我发送了一个请求,那么除了日志文件外,它总是将日志消息打印到控制台。

我的烧瓶api在flask_test.py中:

from search import keyword_match
@api.route('/match', methods=['GET'])
def match():
text, parameters = _parse_parameters()

json_result = keyword_match(text, **parameters)
return json_result
if __name__ == '__main__':
#api.run(host='0.0.0.0', port='5000')
logger.info('Test log in Flask api!')
from waitress import serve
serve(api, host="0.0.0.0", port=5000)

"main"中的记录器仍然按预期工作,它没有打印到控制台,因为我的记录器中没有配置流处理程序。但是,search.py中有一条logger消息,它定义了关键字匹配函数:

from kg import logger
logger = logger.my_logger(__name__)
def keyword_match(keyword, **args):
logger.info('keyword: {}'.format(keyword))
...

它就在这个文件中,它总是将日志信息打印到控制台上,即使我自己的记录器定义中没有流处理程序。Flask流处理程序似乎总是打开的,如何关闭它?我在我的flask_test.py中尝试过这个,但它没有帮助:

logger = logger.my_logger(__name__)
app = Flask(__name__)
from flask.logging import default_handler
app.logger.removeHandler(default_handler)

怎么了?

在删除默认处理程序后,您是否尝试过将这行代码:logger = logger.my_logger(__name__)移动/删除到?

根据我的理解,flask默认理解logger对象是什么。但在引用app.logger之前有这行代码意味着logger的含义已经改变。

app = Flask(__name__)
from flask.logging import default_handler
app.logger.removeHandler(default_handler)
logger = logger.my_logger(__name__)

相关内容

最新更新