Python Flask记录问题

时间:2019-01-10 02:40:09

标签: python flask

我要为一些非常琐碎的东西编写一个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(..),则会使用我已有的相应调试日志来创建日志文件。

我一直在努力理解这一点-我确实使用了烧瓶内置的日志处理程序,但查看它的实现,它附加到日志记录模块本身。因此,整个事情仍然没有意义。在这里的任何帮助或指示,将不胜感激。

1 个答案:

答案 0 :(得分:0)

使用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产生的一些典型日志记录输出。