用Foreman记录烧瓶

时间:2013-12-08 18:59:37

标签: python heroku flask foreman procfile

我正在尝试设置一个Heroku-ready 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

并登录stdout。

但是,当我按照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!'

所以我无法弄清楚如何在调试模式下运行和/或获取日志输出:

foreman start -p 5000

Procfile:

web: gunicorn hello:app

1 个答案:

答案 0 :(得分:11)

Flask应用程序的默认日志记录配置在调试与生产模式下有所不同。

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

第二个示例未处于调试模式。未启用调试模式时,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控制的应用程序启用调试模式,尽管这不是我为生产应用程序推荐的内容:

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