Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 500错误,apache日志中没有任何内容_Python_Apache_Sqlalchemy_Mod Wsgi_Flask - Fatal编程技术网

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

Python 500错误,apache日志中没有任何内容,python,apache,sqlalchemy,mod-wsgi,flask,Python,Apache,Sqlalchemy,Mod Wsgi,Flask,我目前正在基于flask开发一个应用程序。通过使用app.run()手动生成服务器,它运行良好。我现在试着通过mod\wsgi运行它。奇怪的是,我得到了一个500错误,而日志中什么也没有。我做了一些调查,以下是我的发现 插入一行,如print>>sys.stderr,“hello”可以正常工作。该消息显示在错误日志中 当调用一个方法而不使用模板时,它工作得很好。没有错误 使用简单的模板也很好 但是一旦触发模板内的数据库访问(例如,在查询上循环),我就会得到错误 我的直觉告诉我,是SQLAlc

我目前正在基于flask开发一个应用程序。通过使用
app.run()
手动生成服务器,它运行良好。我现在试着通过
mod\wsgi
运行它。奇怪的是,我得到了一个500错误,而日志中什么也没有。我做了一些调查,以下是我的发现

  • 插入一行,如
    print>>sys.stderr,“hello”
    可以正常工作。该消息显示在错误日志中
  • 当调用一个方法而不使用模板时,它工作得很好。没有错误
  • 使用简单的模板也很好
  • 但是一旦触发模板内的数据库访问(例如,在查询上循环),我就会得到错误
我的直觉告诉我,是SQLAlchemy发出了一个错误,可能是一些日志配置导致日志在应用程序中的某个点被丢弃

此外,对于测试,我使用SQLite。据我回忆,这只能从一个线程访问。因此,如果
mod_wsgi
产生更多线程,可能会破坏应用程序

我有点不知所措,因为它只会打断运行在
mod_wsgi
后面的程序,这似乎也会吞下我的错误。我该怎么做才能使错误出现在apache错误日志中


作为参考,代码可以查看。

结果表明我并不是完全错了。这个异常确实是sqlalchemy抛出的。默认情况下,当它流到stdout时,
mod_wsgi
会自动忽略它(据我所知)

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

其实很简单。将日志重定向到
stderr
。您只需将以下内容添加到WSGI脚本中:

import logging, sys
logging.basicConfig(stream=sys.stderr)
现在,这是最普通的日志记录配置。由于我还没有为我的应用程序准备好任何东西,这就可以了。但是,我想,一旦应用程序成熟,无论如何,您将拥有一个更复杂的日志配置,所以这不会影响您


但是,对于快速而肮脏的调试,这将很好。

如果您将其放入
config.py
中,它将大大有助于将错误传播到apache错误日志:

PROPAGATE_EXCEPTIONS = True

我有一个类似的问题:没有日志的偶尔“内部服务器错误”。当您使用mod_wsgi时,您应该删除“
app.run()
”,因为如果我们将该应用程序部署到mod_wsgi,这将始终启动本地wsgi服务器,而我们不希望启动本地wsgi服务器。看见我不知道这是否是您的情况,但我希望这能有所帮助。

也解释了这一点。如果启用调试模式,错误将流向apache日志。一旦你禁用它,你需要建立日志记录,否则他们将一事无成。我可以确认
logging.handlers.SMTPHandler
对于已部署的应用程序非常有效。@robots.jpg:我错过了。。。有时候,显然最好把文档读几遍……;)除了它是非全局的之外,我也同样相信:
app.logger.addHandler(logging.StreamHandler(stream=sys.stderr))
What config.py?此多层应用程序的哪个部分?