我目前正在开发基于flask
的应用程序。它可以使用app.run()
手动生成服务器。我现在尝试通过mod_wsgi
运行它。奇怪的是,我得到500错误,日志中没有任何内容。我调查了一下,这是我的发现。
print >>sys.stderr, "hello"
之类的行可以正常工作。该消息显示在错误日志中。我的直觉告诉我,SQLAlchemy会发出错误,也许某些日志配置会导致日志在应用程序的某个时刻被丢弃。
此外,为了测试,我使用的是SQLite。据我所知,这只能从一个线程访问。因此,如果mod_wsgi
产生更多线程,则可能会破坏应用程序。
我有点不知所措,因为它只会在mod_wsgi
后面运行,这似乎也吞噬了我的错误。我该怎么做才能使错误冒泡进入apache error_log?
作为参考,可以看到代码on this github permalink。
答案 0 :(得分:54)
原来我并非完全错误。 sqlalchemy确实抛出了这个例外。因为它默认流式传输到stdout
,mod_wsgi
默默地忽略它(据我所知)。
回答我的主要问题:如何查看WSGI应用程序产生的错误?
实际上非常简单。将日志重定向到stderr
。您需要做的唯一事情是将以下内容添加到您的WSGI脚本中:
import logging, sys
logging.basicConfig(stream=sys.stderr)
现在,这是最普通的日志配置。因为我还没有为我的应用程序做任何事情,所以这样做。但是,我想,一旦应用程序成熟,你将会有一个更复杂的日志配置,所以这不会咬你。
但是对于快速而肮脏的调试,这样做会很好。
答案 1 :(得分:0)
如果你把它放到你的config.py
中,它将有助于将错误传播到apache错误日志:
PROPAGATE_EXCEPTIONS = True
答案 2 :(得分:0)
我遇到了类似的问题:偶尔的“内部服务器错误”没有日志。当你使用mod_wsgi时,你应该删除“app.run()
”,因为如果我们将该应用程序部署到mod_wsgi,这将始终启动我们不想要的本地WSGI服务器。见docs。我不知道这是不是你的情况,但我希望这会有所帮助。