2010-07-14 65 views
0

我正在使用Python在DreamHost上托管的网站上工作。有一段时间,我使用默认设置,它使用CGI运行Python脚本。它运行良好,但是我担心如果流量很大,运行速度会很慢并且会占用大量内存,所以我使用this module将其切换到FastCGI。使用FastCGI查看Python网站中写入stderr的内容

总的来说,它仍然正常工作,但有一个主要的烦恼:我似乎无法看到任何写入标准错误流的东西。如果出现任何问题,我通常有用的线索来解决该问题。之前,我曾经在Apache错误日志中看到发送给标准错误的东西。现在,它似乎消失了。

我试着制作一个测试脚本,并且使用sys.stderr.write(来自不同的地方)和environ [“wsgi.errors”]写入字符串(从我的应用程序中,其中environ是第一个传递的参数由WSGI/FastCGI包装器应用到应用程序)。无论哪种方式,我都找不到它们。有谁知道为什么,或者如何访问这些数据?

请记住,这是我第一次使用FastCGI,所以请让我知道如果我通过使用这个fcgi模块做出不好的选择。

回答

2

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

要在终止您的代码之前捕获任何未捕获的异常,请将函数指定给您,在其中获取信息并以您选择的任何方式发出;或者,即使没有例外(如果这就是你想要的 - 我不确定,从你的问题),使用atexit到 注册你的抓取信息并发出它功能。

+0

引用FASTCGI规范(http://www.fastcgi.com/drupal/node/6?q=node/22)。 “它没有传统的打开文件stdin,stdout和stderr,并且它通过环境变量没有收到太多的信息”。因此,取决于FASTCGI系统是否被宗教使用,可能根本不会有任何问题。正如Alex所说,将stderr映射到某个东西。最简单的方法是在FASTCGI脚本文件中首先尝试'sys.stderr = open(“/ tmp/myerrors.log”,“w +”)''。 – 2010-07-14 05:37:23

+0

我试过你关于重新分配sys.stderr的建议,它工作。有点。我无法像以前那样将错误记录到错误日志中,但这可能足以满足我的目的。 我没有尝试sys.excepthook为此目的,但我已经使用过它,它似乎会工作。 我还没有尝试过Atexit。 – 2010-07-15 05:29:24

+1

@mikez,是的,我不知道如何从fastcgi内部的Apache日志中写入(我不会使用它 - “mod_wsgi”!)。但是,写入文件,使用'logging'模块将错误日志邮寄给你自己,在浏览器上显示错误日志(对于尚未投入使用的网站,只有:我的网站向我展示了大量的回溯,无论是Java或Python或任何其他的东西,当他们有问题,我只是一个用户!)等等,是其他几种可能性。 – 2010-07-15 05:55:03