500错误apache日志中没有任何内容

时间:2011-11-04 09:29:59

标签: python apache sqlalchemy mod-wsgi flask

我目前正在开发基于flask的应用程序。它可以使用app.run()手动生成服务器。我现在尝试通过mod_wsgi运行它。奇怪的是,我得到500错误,日志中没有任何内容。我调查了一下,这是我的发现。

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

我的直觉告诉我,SQLAlchemy会发出错误,也许某些日志配置会导致日志在应用程序的某个时刻被丢弃。

此外,为了测试,我使用的是SQLite。据我所知,这只能从一个线程访问。因此,如果mod_wsgi产生更多线程,则可能会破坏应用程序。

我有点不知所措,因为它只会在mod_wsgi后面运行,这似乎也吞噬了我的错误。我该怎么做才能使错误冒泡进入apache error_log?

作为参考,可以看到代码on this github permalink

3 个答案:

答案 0 :(得分:54)

原来我并非完全错误。 sqlalchemy确实抛出了这个例外。因为它默认流式传输到stdoutmod_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。我不知道这是不是你的情况,但我希望这会有所帮助。