我想在生产金字塔网络项目中临时打开调试消息,因此我调整了production.ini文件,将其推送到Heroku并只看到错误和警告级别的消息。
production.ini
所以我想,这似乎很奇怪,因为如果我在本地电脑上启动如下所示的金字塔应用程序,我会收到所有日志级别的消息。
env/bin/pserve production.ini
好的,这并不是它在 Heroku 上的运行方式,它实际上是从一小段如下所示的 Python 代码中运行的(在一个名为的文件中runapp.py):
runapp.py
import os from paste.deploy import loadapp from waitress import serve if __name__ == "__main__": port = int(os.environ.get("PORT", 5000)) app = loadapp('config:production.ini', relative_to='.') serve(app, host='0.0.0.0', port=port)
现在,如果我在本地电脑上执行此操作,我肯定会得到与部署到 Heroku 时相同的行为(这并不奇怪)。
python runapp.py
我的问题是,我在这里遗漏了什么?为什么以第二种方式运行它会导致除 ERROR 和 WARN 之外没有其他日志消息输出到标准输出?当然,由于它使用的是同一个production.ini文件,因此它应该像我使用该pserve过程一样工作?
pserve
这是我的日志部分production.ini:
### # logging configuration # http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/logging.html ### [loggers] keys = root, test [handlers] keys = console [formatters] keys = generic [logger_root] level = DEBUG handlers = console [logger_test] level = DEBUG handlers = console qualname = test [handler_console] class = StreamHandler args = (sys.stderr,) level = DEBUG formatter = generic [formatter_generic] format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
PasteDeploy 实际上并不承担配置日志记录的责任。这是一个小问题,INI 文件具有双重用途。有些部分 PasteDeploy 关心,有些部分 不logging.config.fileConfig关心,并且必须同时运行这两个部分才能完全加载 INI 文件。
logging.config.fileConfig
如果你按照金字塔包装器来做这件事,你应该这样做:
pyramid.paster.setup_logging(inipath) pyramid.paster.get_app(inipath)
您使用这些而不是自己做的主要原因是,当inipath包含像这样的部分说明符时development.ini#myapp,它们支持做“正确的事情”,而这fileConfig会导致崩溃。
inipath
development.ini#myapp
fileConfig