2011-11-04 79 views
36

我目前正在開發一個基於flask的應用程序。它使用app.run()手動生成服務器。我試圖通過mod_wsgi現在運行它。奇怪的是,我得到一個500錯誤,並沒有在日誌中。我調查了一下,這裏是我的發現。500 apache日誌中沒有任何東西的錯誤

  • 插入像print >>sys.stderr, "hello"這樣的行可按預期工作。該消息顯示在錯誤日誌中。
  • 在不使用模板的情況下調用方法時,它工作得很好。沒有500錯誤。
  • 使用簡單的模板也能正常工作。
  • 但是只要我觸發數據庫訪問裏面模板(例如循環查詢)我得到的錯誤。

我的直覺告訴我,它是SQLAlchemy發出錯誤,也許某些日誌記錄配置會導致日誌在應用程序中的某個時刻被丟棄。

此外,爲了測試,我正在使用SQLite。據我所知,這隻能從一個線程訪問。所以如果mod_wsgi產生更多的線程,它可能會破壞應用程序。

我有點不知所措,因爲它只能在mod_wsgi後面跑步,這似乎也吞噬了我的錯誤。我能做些什麼來使錯誤冒泡到Apache的error_log中?

僅供參考,代碼見on this github permalink

回答

52

原來我並沒有完全錯誤。 sqlalchemy確實拋出了這個例外。因爲默認情況下,它流式傳輸到stdout,所以mod_wsgi默默地忽略它(據我所知)。

回答我的主要問題:如何查看WSGI應用程序產生的錯誤?

其實很簡單。將您的日誌重定向到stderr。你需要做的唯一的事情,就是下面添加到您的WSGI腳本:

import logging, sys 
logging.basicConfig(stream=sys.stderr) 

現在,這是最平凡的日誌記錄配置。因爲我還沒有爲我的應用程序添加任何東西,所以這樣做。但是,我想,一旦應用程序成熟,無論如何你都將擁有更復雜的日誌配置,所以這不會讓你感到厭煩。

但是對於快速和骯髒的調試,這將會很好。

+6

http://flask.pocoo.org/docs/errorhandling/也解釋了這一點。如果啓用調試模式,則錯誤將流入apache日誌。一旦你禁用它,你需要建立日誌記錄,否則他們將無處可去。我可以確認'logging.handlers.SMTPHandler'很適合部署的應用程序。 –

+0

@ robots.jpg:我錯過了...有時顯然最好是多次閱讀文檔...;) – exhuma

+0

我相信除了它是非全局的等效:'app.logger.addHandler(logging.StreamHandler(stream = sys.stderr))' – jpmc26

0

如果你把這個變成你的config.py這將大大有助於傳播錯誤到Apache的錯誤日誌:

PROPAGATE_EXCEPTIONS = True 
0

我有一個類似的問題:偶爾「內部服務器錯誤」沒有日誌。當你使用mod_wsgi時,你應該刪除「app.run()」,因爲如果我們將該應用程序部署到mod_wsgi,這將始終啓動我們不想要的本地WSGI服務器。見docs。我不知道這是否是你的情況,但我希望這可以幫助。

相關問題