我即将为一些非常琐碎的事情写一个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内置的日志处理程序,但看看它的实现,它会附加到日志记录模块本身。因此,整个事情仍然没有意义。这里的任何帮助或指导都将不胜感激。
发布于 2019-01-10 14:28:38
使用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生成的典型日志记录输出。
https://stackoverflow.com/questions/54121257
复制相似问题