Django AdminEmailHandler导致wsgi挂起

时间:2014-06-24 07:28:43

标签: python django apache logging wsgi

我在python 2.7上使用django 1.7构建一个webapp,在生产中使用apache和mod_wsgi在守护进程模式下部署。每当我记录异常(使用python日志记录)并在我的settings.py中配置AdminEmailHandler时,我都会遇到wsgi挂起的问题。

当我请求页面时,浏览器会挂起,直到最终apache日志显示"脚本输出结束前的标题:wsgi.py"

我配置了两个日志处理程序,一个FileHandler和AdminEmailHandler,当我注释掉AdminEmailHandler时,问题不会发生。

'handlers': {
    'file': {
        'level': 'INFO',
        'class': 'logging.FileHandler',
        'filename': '/var/log/apache2/mylog',
        'formatter':'simple',
    },
    'email': {
        'level': 'ERROR',
        'class': 'django.utils.log.AdminEmailHandler',
        'formatter':'simple',
    }

我已经看到我可以使用

配置wsgi
WSGIApplicationGroup %{GLOBAL}

并且mod_wsgi存在应用程序问题(来自this question)。

但是,如果可能的话,我想保留守护进程模式,而AdminEmailHandler似乎是日志功能的核心部分,我很惊讶以前没有遇到过它!

提前感谢您的帮助

更新

我用我自己的AdminEmailHandler子类修复了这个问题,该子类将发送的电子邮件委托给一个单独的线程。感谢Vinay的帮助!

from threading import Thread
import django.utils.log as djangolog
class MyAdminEmailHandler(djangolog.AdminEmailHandler):
    def emit(self, record):
        try:
            thread = Thread(target=djangolog.AdminEmailHandler.emit, args=(self, record))
            thread.start()
        except:
            self.handleError(record)

1 个答案:

答案 0 :(得分:0)

我不相信这与守护进程模式特别相关 - SMTP更有可能阻止您的网络应用。请参阅this question以及可能解决方案的所有答案。