小能豆

为什么使用 paste.deploy 中的 loadapp 时我的日志级别未被使用?

py

我想在生产金字塔网络项目中临时打开调试消息,因此我调整了production.ini文件,将其推送到Heroku并只看到错误和警告级别的消息。

所以我想,这似乎很奇怪,因为如果我在本地电脑上启动如下所示的金字塔应用程序,我会收到所有日志级别的消息。

env/bin/pserve production.ini

好的,这并不是它在 Heroku 上的运行方式,它实际上是从一小段如下所示的 Python 代码中运行的(在一个名为的文件中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过程一样工作?

这是我的日志部分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

阅读 34

收藏
2024-11-05

共1个答案

小能豆

PasteDeploy 实际上并不承担配置日志记录的责任。这是一个小问题,INI 文件具有双重用途。有些部分 PasteDeploy 关心,有些部分 不logging.config.fileConfig关心,并且必须同时运行这两个部分才能完全加载 INI 文件。

如果你按照金字塔包装器来做这件事,你应该这样做:

pyramid.paster.setup_logging(inipath)
pyramid.paster.get_app(inipath)

您使用这些而不是自己做的主要原因是,当inipath包含像这样的部分说明符时development.ini#myapp,它们支持做“正确的事情”,而这fileConfig会导致崩溃。

  • 太棒了,谢谢 - 效果很好。我替换了行:“from paste.deploy import loadapp”为“import pyramid.paster”,并将“app = loadapp(‘config:production.ini’,relative_to=’.’)”行替换为您给我的两行(只需为它们传入“production.ini”),它运行良好并应用了我的日志记录,
2024-11-05