在烧瓶应用程序中将日志记录设置代码放在哪里?

Where to put logging setup code in a flask app?

我正在编写我的第一个 Flask 应用程序。应用程序本身运行良好。我只是有一个关于在生产模式下登录的新手问题。

基本结构:

app/
app/templates/
app/static
config.py
flask/... <- virtual env with flask + extensions
run.py

应用程序由 run.py 脚本启动:

#!flask/bin/python

import os.path
import sys

appdir = os.path.dirname(os.path.abspath(__file__))
if appdir not in sys.path:
    sys.path.insert(1, appdir)

from app import app as application

if __name__ == '__main__':
    application.run(debug=True)

并且直接启动或从 Apache 2.4 网络服务器启动。我在 apache 配置中有这些行:

WSGIPythonHome /usr/local/opt/app1/flask
WSGIScriptAlias /app1 /usr/local/opt/app1/run.py

在前一种情况下,debug=True 是我开发所需要的。

我也想为后一种情况进行一些日志记录,即当 运行 在生产服务器上的 Apache 下。以下是来自 Flask 文档的建议:

if not app.debug:
    import logging
    from themodule import TheHandlerYouWant
    file_handler = TheHandlerYouWant(...)
    file_handler.setLevel(logging.WARNING)
    app.logger.addHandler(file_handler)

它需要一些定制,但这就是我想要的 - 针对未设置 app.debug 标志的情况的说明。这里也给出了类似的建议: How do I write Flask's excellent debug log message to a file in production?

请帮忙:我必须把这段代码放在哪里?


更新:根据 davidism 的评论和我得到的第一个答案,我认为当前简单形式的应用程序不适合我的要求。我将按照此处的建议修改它以使用不同的配置数据集:http://flask.pocoo.org/docs/0.10/config/#development-production。如果我的应用程序更大,我会按照 pech0rin 的回答。

更新 2:我认为这里的关键是环境变量应该控制应用程序的配置方式。

我在 create_app 函数中设置日志记录配置方面取得了很大成功。这使用了application factory pattern。这允许您传入一些参数或配置 class。然后使用您的参数专门创建应用程序。

这允许您初始化应用程序、设置日志记录,并在应用程序被发送回 运行 之前执行任何您想执行的操作。

例如:

def create_app(dev=False):
   app = Flask(__name__)
   if dev:
      app.config['DEBUG'] = True
   else:
      ...
      app.logger.addHandler(file_handler)
   return app

这在生产环境中对我来说效果很好。 YMMV