【问题标题】: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,但我无法调试它以查看异常的来源。有什么办法可以看到这些信息?

【问题讨论】:

  • 写入标准输出的任何内容都应该记录在您的日志中。
  • @Erik stderr 呢? This question 似乎表明 heroku 遇到了 stderr 问题。

标签: 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'] = Trueapp.run(..., debug=True)

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

      【讨论】:

        猜你喜欢
        • 2014-02-13
        • 2014-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-25
        • 1970-01-01
        相关资源
        最近更新 更多