用Foreman记录烧瓶

Yar*_*rin 7 python heroku flask foreman procfile

我正在尝试设置一个Heroku-ready Flask应用程序,但我无法弄清楚如何打开日志记录.

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

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)
Run Code Online (Sandbox Code Playgroud)

像这样开始:

python hello.py
Run Code Online (Sandbox Code Playgroud)

并登录stdout.

但是,当我遵循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!'
Run Code Online (Sandbox Code Playgroud)

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

foreman start -p 5000
Run Code Online (Sandbox Code Playgroud)

Procfile:

web: gunicorn hello:app
Run Code Online (Sandbox Code Playgroud)

Mig*_*uel 12

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!'
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意,您可以不执行任何操作,只需为Foreman/Heroku控制的应用程序启用调试模式,尽管这不是我为生产应用程序推荐的内容:

from flask import Flask
app = Flask(__name__)
app.debug = True
Run Code Online (Sandbox Code Playgroud)