python - 使用 Foreman 进行 Flask 日志记录

标签 python heroku flask foreman procfile

我正在尝试设置一个支持 Heroku 的 Flask 应用程序,但我不知道如何打开日志记录。

没有 Foreman,我可以创建一个 helloworld 应用程序,如 Flask tutorial 中所述:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    app.logger.debug('A value for debugging')
    app.logger.warning('A value for warning')
    return "Hello World!"

if __name__ == "__main__":
    app.run(debug=True)

像这样启动它:

python hello.py

并登录标准输出。

当我关注 Heroku tutorial ,但是,没有 app.run 行:

import os
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    app.logger.debug('A value for debugging')
    app.logger.warning('A value for warning')
    return 'Hello World!'

所以我不知道如何在 Debug模式下运行和/或获取日志输出:

foreman start -p 5000

简介:

web: gunicorn hello:app

最佳答案

Flask 应用程序的默认日志记录配置在 Debug模式和生产模式下是不同的。

在您的第一个示例中,您处于 Debug模式。在这种情况下,Flask 定义了一个日志处理程序,它将所有级别为 logging.DEBUG 或更高级别的消息记录到 stderr

第二个示例未处于 Debug模式。当未启用 Debug模式时,Flask 会创建一个记录器对象,但不会向其添加任何处理程序,因此不会打印任何内容。

对于 Foreman 和 Heroku,您需要将日志发送到 stdoutstderr,因此您需要做的就是添加一个 StreamHandler您选择的日志记录级别:

import os
from flask import Flask

app = Flask(__name__)

# log to stderr
import logging
from logging import StreamHandler
file_handler = StreamHandler()
app.logger.setLevel(logging.DEBUG)  # set the desired logging level here
app.logger.addHandler(file_handler)

@app.route('/')
def hello():
    app.logger.debug('A value for debugging')
    app.logger.warning('A value for warning')
    return 'Hello World!'

或者,如果您愿意,您也可以不执行任何操作,只为 Foreman/Heroku 控制的应用程序启用 Debug模式,尽管我不建议对生产应用程序这样做:

from flask import Flask
app = Flask(__name__)
app.debug = True

关于python - 使用 Foreman 进行 Flask 日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20457567/

相关文章:

python - 如何计算数字列表中的平均数

python - 在 while 循环内访问 ROS 中的回调函数?

maven - docker-compose build 每次都下载一些 pom 依赖项

python - 根据参数将 View 路由到另一个 URL

python - 执行透视变形时,如何避免图像的一部分被切割?

python - "match nothing"的正则表达式语法?

java - 无法使用 Heroku postgres 将数据添加到 Spring Boot 上的数据库

python - Heroku找不到pip(很奇怪)

python - Flask 线程共享值

javascript - bootstrap 标签输入带有 typeahead throws (str || "").replace 不是函数