我在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__)