如何在python中查看Heroku日志和运行时错误输出

2024-06-06 20:36:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python和Heroku开发一个web应用程序,我不知道如何有效地测试调试它。我试过使用print(…)和sys.stdout.write(…),但是当我使用“foreman start”在本地运行时,或者当我部署到云并运行“heroku logs”来查看云日志时,我从未看到任何输出。此外,我不知道如何调试python运行时错误,例如异常何时发生。应用程序的web请求返回一个HTTP 500,但是我无法调试它来查看异常的起源。有没有办法看到这些信息?


Tags: web应用程序httpheroku部署错误stdoutsys
3条回答

请注意任何其他Django/Python beginngers。记住要加

import sys

像这样的东西

print ("hello world") # python 3
sys.stdout.flush()

将打印到控制台。

从PHP迁移到Py/Dj KISS是很少见的。

如果您使用Foreman来运行一个Python项目,并且在看到stdout/stderr时遇到问题,这里有一些解决方案。如果使用Procfile直接调用python CLI,那么可以使用'-u'选项来避免stdout缓冲:

python -u script.py

如果使用Procfile管理WSGI服务器,例如调用gunicorn、flask、bottle、eve等,则可以将“.env”文件添加到python项目的根目录中,其中包含以下内容:

PYTHONUNBUFFERED=True

另请参见此问题的答案: foreman only shows line with “started wit pid #” and nothing else

在print语句之后添加sys.stdout.flush()为我解决了这个问题。

在我的例子中,问题似乎是stdout是缓冲的,而stderr不是。

如果您甚至没有通过foreman start看到异常,请确保您确实在正确的IP/端口上访问了服务器。您应该在foreman start的输出中看到HTTP访问条目(例如GET/index.html)。

另外,您可以尝试告诉您的web框架以调试模式运行大多数现代框架将在浏览器中以调试/开发模式显示stacktrace。用烧瓶?app.config['DEBUG'] = Trueapp.run(..., debug=True)

# logging helper
def p(*args):
  print args[0] % (len(args) > 1 and args[1:] or [])
  sys.stdout.flush()

相关问题 更多 >