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

exh*_*uma 40 python apache mod-wsgi sqlalchemy flask

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

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

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

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

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

作为参考,代码可以在这个github永久链接上看到.

exh*_*uma 54

原来我并没有完全错.sqlalchemy确实抛出了这个例外.因为它stdout默认流式传输,mod_wsgi默默地忽略它(据我所知).

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

它实际上非常简单.将日志重定向到stderr.您需要做的唯一事情是将以下内容添加到WSGI脚本中:

import logging, sys
logging.basicConfig(stream=sys.stderr)
Run Code Online (Sandbox Code Playgroud)

现在,这是最普通的日志配置.因为我还没有为我的应用程序做任何事情,所以这样做.但是,我想,一旦应用程序成熟,你将拥有更复杂的日志配置,所以这不会咬你.

但是对于快速和脏的调试,这样做会很好.

  • http://flask.pocoo.org/docs/errorhandling/也解释了这一点.如果启用了调试模式,则错误将流向apache日志.一旦禁用它,您需要设置日志记录,否则它们将无处可寻.我可以确认`logging.handlers.SMTPHandler`适用于已部署的应用程序. (6认同)