apache 日志中没有任何内容的 500 错误
Posted
技术标签:
【中文标题】apache 日志中没有任何内容的 500 错误【英文标题】:500 Error without anything in the apache logs 【发布时间】:2011-12-21 20:56:45 【问题描述】:我目前正在开发基于flask
的应用程序。它运行良好,使用app.run()
手动生成服务器。我现在尝试通过mod_wsgi
运行它。奇怪的是,我收到 500 错误,日志中没有任何内容。我进行了一些调查,这是我的发现。
print >>sys.stderr, "hello"
这样的行可以按预期工作。该消息显示在错误日志中。
在不使用模板的情况下调用方法时效果很好。没有 500 错误。
使用简单的模板也可以。
但是一旦我在模板中触发数据库访问(例如循环查询),我就会收到错误消息。
我的直觉告诉我是 SQLAlchemy 发出了错误,并且可能某些日志记录配置导致日志在应用程序中的某个点被丢弃。
另外,为了测试,我使用的是 SQLite。据我所知,这只能从一个线程访问。所以如果mod_wsgi
产生更多线程,它可能会破坏应用程序。
我有点不知所措,因为它只会在mod_wsgi
后面跑,这似乎也吞噬了我的错误。我该怎么做才能使错误冒泡到 apache error_log 中?
供参考,代码可见on this github permalink。
【问题讨论】:
【参考方案1】:事实证明我并没有完全错。异常确实是由 sqlalchemy 抛出的。由于它默认流式传输到stdout
,mod_wsgi
默默地忽略了它(据我所知)。
回答我的主要问题:如何查看 WSGI 应用程序产生的错误?
其实很简单。将您的日志重定向到stderr
。您唯一需要做的就是将以下内容添加到您的 WSGI 脚本中:
import logging, sys
logging.basicConfig(stream=sys.stderr)
现在,这是最普通的日志记录配置。因为我还没有为我的应用程序准备好任何东西,所以这将是可行的。但是,我想,一旦应用程序成熟,无论如何你都会有一个更复杂的日志配置,所以这不会对你不利。
但是为了快速而肮脏的调试,这会很好。
【讨论】:
flask.pocoo.org/docs/errorhandling 也解释了这一点。如果启用调试模式,错误将流入 apache 日志。禁用它后,您需要设置日志记录,否则它们将无处可去。我可以确认logging.handlers.SMTPHandler
非常适合已部署的应用程序。
@robots.jpg:我错过了……有时显然最好多读几遍文档……;)
我同样相信,除了它是非全局的:app.logger.addHandler(logging.StreamHandler(stream=sys.stderr))
【参考方案2】:
我遇到了类似的问题:偶尔出现“内部服务器错误”而没有日志。当您使用 mod_wsgi 时,您应该删除“app.run()
”,因为如果我们将该应用程序部署到 mod_wsgi,这将始终启动我们不想要的本地 WSGI 服务器。见docs。我不知道这是否是你的情况,但我希望这可以帮助。
【讨论】:
【参考方案3】:如果您将其放入您的config.py
,它将极大地帮助将错误传播到 apache 错误日志:
PROPAGATE_EXCEPTIONS = True
【讨论】:
什么config.py?这个多层应用程序的哪一部分?以上是关于apache 日志中没有任何内容的 500 错误的主要内容,如果未能解决你的问题,请参考以下文章
没有 Laravel 日志或 Apache 日志的新 Laravel 8 安装 500 服务器错误