500错误,但Apache日志中没有任何信息

40 投票
3 回答
15991 浏览
提问于 2025-04-17 05:38

我现在正在开发一个基于 flask 的应用程序。手动使用 app.run() 启动服务器时一切正常。但是我尝试通过 mod_wsgi 来运行它,结果却奇怪地出现了500错误,而且日志里什么也没有。我调查了一下,发现了一些情况。

  • 插入一行像 print >>sys.stderr, "hello" 的代码可以正常工作。这个信息会出现在错误日志里。
  • 调用一个方法而不使用模板时,一切都很好。没有500错误。
  • 使用一个简单的模板也没问题。
  • 但是一旦我在模板里面触发数据库访问(比如循环查询)就会出现错误。

我感觉可能是SQLAlchemy发出了错误,可能某些日志配置导致日志在应用的某个地方被丢弃了。

另外,为了测试,我使用的是SQLite。根据我的记忆,它只能被一个线程访问。所以如果 mod_wsgi 启动了更多线程,可能会导致应用崩溃。

我有点困惑,因为这个问题只在 mod_wsgi 后面运行时出现,而且它似乎还吞掉了我的错误信息。我该怎么做才能让错误信息显示在apache的错误日志里呢?

有关代码的参考,可以在这个 github链接 上查看。

3 个回答

-2

如果你把这个放到你的 config.py 文件里,它会大大帮助你把错误信息传递到 Apache 的错误日志中:

PROPAGATE_EXCEPTIONS = True
0

我遇到过类似的问题:偶尔会出现“内部服务器错误”,而且没有任何日志记录。当你使用mod_wsgi的时候,应该去掉"app.run()"这行代码,因为这会启动一个本地的WSGI服务器,而我们在把应用部署到mod_wsgi的时候是不需要这个的。你可以查看一下文档。我不知道这是否适用于你的情况,但希望这能对你有所帮助。

54

原来我并不是完全错了。这个错误确实是由sqlalchemy抛出的。因为默认情况下,它会被发送到stdout,所以mod_wsgi就默默地忽略了这个错误(就我所知是这样的)。

现在来回答我最主要的问题:如何查看WSGI应用产生的错误呢?

其实很简单。只需要把你的日志重定向到stderr。你只需要在你的WSGI脚本中添加以下内容:

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

现在,这个日志配置是最基础的。因为我还没有为我的应用设置其他东西,所以这样就可以了。不过,我想等到应用成熟后,你肯定会有更复杂的日志配置,所以这不会给你带来麻烦。

但对于快速调试来说,这样就足够了。

撰写回答