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 抛出的。由于它默认流式传输到stdoutmod_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 错误的主要内容,如果未能解决你的问题,请参考以下文章

php返回500错误但没有错误日志

没有 Laravel 日志或 Apache 日志的新 Laravel 8 安装 500 服务器错误

503 使用 apache/wsgi 在日志中没有任何痕迹

关于Apache php 报500错误

乘客配置重启应用程序返回 500 内部错误,没有任何错误日志条目

Apache:“未设置 AuthType!” 500 错误