Python Flask 日志记录问题

标签 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(..),日志文件将使用我已有的相应调试日志创建。

我一直在努力理解这一点 - 我确实登陆了 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/

相关文章:

python - 将 Amazon S3 与 Heroku、Python 和 Flask 结合使用

forms - 使用 Flask/Jinja2 重复表单元素的最佳实践?

python - 使用 python,自动确定用户当前时区的最准确方法是什么

python-3.x - Google 无法获取我的 sitemap.xml 文件

python - 断言错误 : Label class 15 exceeds nc=1 in data/coco128. yaml.可能的类标签是 0-0

python - 在没有数据库的情况下在 Django 中进行身份验证

python - 如何从多个等长数组中删除相同的随机项?

python - 使用 contrib 模块安装 openCV

python - 使用QThread的PyQt5 OpenCV WebCam

python - 从 flask 中访问 mysql