2010-07-14 40 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