我即将为一些非常琐碎的事情编写一个 flask 应用程序..并且我在日志记录实践中遇到了障碍。
这是我的简单 Flask 应用程序,我写这个是为了解释我遇到的问题,并且有一段时间一直试图弄清楚 python-logging 和 Flask 发生了什么。
# standard
from flask import Flask
from flask_restful import Api
import logging
import json
# logging config
log_fmt = "%(asctime)s %(levelname)s %(process)d %(filename)s %(funcName)s %(message)s"
logging.basicConfig(
filename="test.log",
filemode="w",
format=log_fmt,
level=logging.DEBUG
)
# create an object of flask (flask is a web framework)
app = Flask(__name__)
api = Api(app)
# health check /
@app.route("/", methods=['GET'])
def default():
logging.debug("/ request received")
out_dict = {
"hello": "world"
}
logging.debug("/ response" + str(out_dict))
return json.dumps(out_dict)
# main function, entry point
if __name__ == "__main__":
# invokes src and runs the application
logging.debug("starting")
# COMMENTING below - gets me the log file! Whats happening with flask & logging?
app.run(host="0.0.0.0", port=7001, debug=True)
logging.debug("stopping")
现在,这是我需要日志记录时通常采用的模式。但是,当我将这种日志记录模式与 app.run(..)
一起应用时,日志文件永远不会被创建。我无法弄清楚为什么会发生这种情况。
但相反..如果我评论app.run(..)
,日志文件将使用我已有的相应调试日志创建。
我一直在努力理解这一点 - 我确实登陆了 flask 内置日志处理程序,但看看它的实现,它附加到日志记录模块本身。所以整件事仍然没有意义。此处的任何帮助或指导将不胜感激。
最佳答案
使用logging.basicConfig
做出了一些假设,这些假设在调用 app.run(...)
时可能会被撤销,因为 Flask 也使用日志记录模块来设置日志输出,正如您所指出的。但是,如果您手动设置文件处理程序并将其附加到根记录器,如下所示(即将 #logging config
部分替换为):
# logging config
log_fmt = "%(asctime)s %(levelname)s %(process)d %(filename)s %(funcName)s %(message)s"
handler = logging.FileHandler('test.log')
handler.setFormatter(logging.Formatter(log_fmt))
root_logger = logging.getLogger()
root_logger.addHandler(handler)
root_logger.setLevel(logging.DEBUG)
这将设置日志记录处理程序,并将格式化程序设置为您指定的 log_fmt
,然后将该处理程序附加到 logging.getLogger()
返回的根记录器。 。运行应用程序,给它一些请求并退出,您应该看到当前工作目录中的 test.log
中显示适当的条目,同时也会显示由 Flask 生成的一些典型日志输出。
关于Python Flask 日志记录问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54121257/