【问题标题】:how to see Heroku logging and runtime error output in python如何在 python 中查看 Heroku 日志记录和运行时错误输出
【发布时间】:2012-09-12 08:16:47
【问题描述】:
我正在使用 Heroku 在 Python 中开发一个 Web 应用程序,但我不知道如何有效地测试调试它。我尝试使用 print(...) 和 sys.stdout.write(...) 但是当我使用“foreman start”在本地运行或部署到云并运行“heroku logs”来查看时,我从未看到任何输出云日志。此外,我不知道如何调试 python 运行时错误,例如发生异常时。该应用程序的 Web 请求返回 HTTP 500,但我无法调试它以查看异常的来源。有什么办法可以看到这些信息?
【问题讨论】:
标签:
python
web-applications
heroku
【解决方案1】:
请注意任何其他 Django/Python 初学者。记得加
import sys
类似的东西
print ("hello world") # python 3
sys.stdout.flush()
将打印到控制台。
从 PHP 迁移到 Py/Dj KISS 可能很少见。
【解决方案2】:
如果您正在使用 Foreman 运行 Python 项目,并且您在查看 stdout/stderr 时遇到问题,这里有一些适合您的解决方案。如果您使用 Procfile 直接调用 python CLI,那么您可以使用“-u”选项来避免标准输出缓冲:
python -u script.py
如果你使用Procfile来管理一个WSGI服务器,比如调用gunicorn、flask、bottle、eve等,那么你可以在你的python项目的根目录下添加一个“.env”文件,包含以下内容:
PYTHONUNBUFFERED=True
另请参阅此问题的答案:
foreman only shows line with “started wit pid #” and nothing else
【解决方案3】:
在打印语句后添加sys.stdout.flush() 为我解决了这个问题。
在我的情况下,问题似乎是 stdout 被缓冲而 stderr 没有。
如果您甚至没有通过foreman start 看到异常,请确保您实际上是在正确的 IP/PORT 访问您的服务器。您应该会在 foreman start 的输出中看到 HTTP 访问条目(例如 GET /index.html)。
另外,您可以尝试让您的 Web 框架在调试模式下运行——大多数现代框架都会在调试/开发模式下在浏览器中显示堆栈跟踪。使用烧瓶? app.config['DEBUG'] = True 或 app.run(..., debug=True)。
# logging helper
def p(*args):
print args[0] % (len(args) > 1 and args[1:] or [])
sys.stdout.flush()