500错误没有任何在Apache日志

我目前正在开发一个基于flask的应用程序。 它运行良好,使用app.run()手动产生服务器。 我试过现在通过mod_wsgi运行它。 奇怪的是,我得到了一个500错误,并没有在日志中。 我已经调查了一下,这里是我的发现。

  • 插入一行像print >>sys.stderr, "hello"按预期工作。 该消息显示在错误日志中。
  • 在不使用模板的情况下调用一个方法时,它的工作原理就好 没有500错误。
  • 使用简单的模板也可以。
  • 但是 ,只要我触发模板的数据库访问(例如循环查询),我得到的错误。

我的直觉告诉我,这是SQLAlchemy发出错误,也许一些日志configuration导致日志在应用程序的某个点被丢弃。

另外,为了testing,我正在使用SQLite。 据我所知,这只能从一个线程访问。 所以,如果mod_wsgi产生更多的线程,它可能会破坏应用程序。

我有点不知所措,因为它只能在mod_wsgi后面运行,这似乎也吞噬了我的错误。 我能做些什么来使错误冒泡到Apache的error_log?

作为参考,代码可以在这个github永久链接 。

原来我并没有完全错误。 sqlalchemy确实抛出了这个例外。 而且,由于默认情况下,它被传输到stdoutmod_wsgi默默地忽略它(据我所知)。

回答我的主要问题:如何查看WSGI应用程序产生的错误?

其实很简单 将日志redirect到stderr 。 您唯一需要做的是将以下内容添加到您的WSGI脚本中:

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

现在,这是最平常的日志configuration。 因为我还没有为我的应用程序放置任何东西,所以这样做。 但是,我想,一旦应用程序成熟,你将有一个更复杂的日志loggingconfiguration,所以这不会咬你。

但是,对于快速和肮脏的debugging,这将做得很好。

如果你把它放到你的config.py ,它将有助于将错误传播到apache错误日志:

 PROPAGATE_EXCEPTIONS = True 

我有一个类似的问题:偶尔的“内部服务器错误”没有日志。 当你使用mod_wsgi的时候,你应该删除“ app.run() ”,因为如果我们将这个应用程序部署到mod_wsgi,它总会启动一个我们不想要的本地WSGI服务器。 看文档 。 我不知道这是你的情况,但我希望这可以帮助。