7

我正在尝试设置 Heroku-ready Flask 应用程序,但我不知道如何打开日志记录。

如果没有 Foreman,我可以按照Flask 教程中的描述创建一个 helloworld 应用程序:

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 教程进行操作时,没有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

档案:

web: gunicorn hello:app
4

1 回答 1

12

Flask 应用程序的默认日志配置在调试模式和生产模式中是不同的。

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

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

对于 Foreman 和 Heroku,您需要将日志发送到stdoutor stderr,因此您需要做的就是添加StreamHandler带有您选择的日志记录级别的 a:

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
于 2013-12-08T19:20:00.743 回答