【问题标题】:Seeing what gets written to stderr in Python web site using FastCGI查看使用 FastCGI 在 Python 网站中写入 stderr 的内容
【发布时间】:2010-07-14 04:59:06
【问题描述】:

我正在开发一个使用 Python 托管在 DreamHost 上的网站。有一段时间,我使用他们的默认设置,它使用 CGI 运行 Python 脚本。它运行良好,但我担心如果我得到大量流量,它会运行缓慢并使用大量内存,所以我使用this module 将其切换到 FastCGI。

总的来说,它仍然可以正常工作,但有一个主要的烦恼:我似乎无法看到写入标准错误流的任何内容。如果出现任何问题,我通常的有用线索来源将不再有效。以前,我曾经在我的 Apache 错误日志中看到发送到标准错误的内容。现在,它似乎消失了。

我尝试制作一个测试脚本,并使用 sys.stderr.write(来自不同地方)和 environ["wsgi.errors"].write(在我的应用程序中,其中 environ 是传递给的第一个参数)编写字符串WSGI/FastCGI 包装器的应用程序)。不管怎样,我找不到他们。有谁知道为什么或如何访问这些数据?

请记住,这是我第一次使用 FastCGI,所以如果我使用这个 fcgi 模块做出了错误的选择,请告诉我。

【问题讨论】:

    标签: python fastcgi wsgi stderr


    【解决方案1】:

    如果您的系统中的某些内容正在捕获文件描述符 2(“真正的”标准错误),您可以将 sys.stderr 分配给任何打开的、可写的文件对象或类似文件的对象(它基本上只需要实现write) -- 包括一个 cStdIO.StdIO 实例,您可以随时(在它关闭之前)通过调用它的 .getvalue() 方法来获取其值。

    要在终止您的代码之前捕获任何未捕获的异常,请将您的函数分配给sys.excepthook,您可以在其中获取信息并以您选择的任何方式发出它;或者,要获取和发出任何写入sys.stderr 的内容,即使没有例外(如果这是你想要的——我不确定,从你的问题来看),使用atexit 来 注册您的获取信息并发送它的功能。

    【讨论】:

    • 引用 FASTCGI 规范 (fastcgi.com/drupal/node/6?q=node/22)。 “它没有常规的打开文件stdin、stdout和stderr,也没有通过环境变量接收太多信息”。因此,根据所使用的 FASTCGI 系统是否尊重这一点,可能根本就没有标准错误。正如亚历克斯所说,将 stderr 映射到某些东西。最简单的方法是尝试 'sys.stderr = open("/tmp/myerrors.log", "w+")' 作为 FASTCGI 脚本文件中的第一件事。
    • 我尝试了你关于重新分配 sys.stderr 的建议,它奏效了。有点。我无法像以前那样让错误进入错误日志,但这对于我的目的来说可能已经足够了。我没有为此目的尝试过 sys.excepthook ,但我以前使用过它,它似乎可以工作。我还没试过atexit。
    • @mikez,是的,我不知道如何从 fastcgi 中的 Apache 日志中写入(无论如何我都不使用它——万岁 mod_wsgi!-)。但是,写入文件,将错误日志邮寄给自己,使用 logging 模块,在浏览器上显示错误日志(对于尚未投入生产的网站,仅:我 讨厌 显示我的大回溯,无论是 Java 还是 Python 或其他任何东西,当他们遇到问题而我只是一个用户时!-) 等等,还有其他几种可能性。
    • 我希望我可以使用 WSGI,但是 DreamHost 并没有正式支持它,我不想做太多实验。我想我可以找到解决这个问题的方法。日志模块看起来很酷。我去看看。
    • 我相信 DreamHost 使用 Phusion Passenger 的 Ruby。它还支持 Python WSGI 功能。如果您确实可以找到有关使用它的文档,则可以尝试使用它,因为人们通常在 DreamHost 上使用它比 FASTCGI 更成功。
    猜你喜欢
    • 1970-01-01
    • 2016-03-29
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多