我在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',
}
我已经看到我可以使用
配置wsgiWSGIApplicationGroup %{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)