这些IO错误是众所周知的,正如在其他SO线程中看到的(见下文),并且可能是由用户在浏览器中间关闭时导致的。有关为什么没有简单解决方案的讨论,请参见this django-developers thread。抑制Django mod_wsgi IO错误
我第一次尝试了在this ioerror SO thread的回答中描述的中间件选项(除了在我们的情况下,我会在请求uri上分支)。 它没有工作:我可以捕捉到响应,并看到就Django而言,文章中没有包含文件,并且它返回了带有验证错误的200响应。 但是,我仍然可以在Apache的错误日志中看到IOError。
接下来我们发现this discussion on a django bug这表明你应该用记录过滤器来压制这个。我试着将过滤器附加到我们的自定义记录器,根记录器和'django.request'...我仍然无法看到IOError压制它!我只能看到与表单失败验证相关的日志消息。
有什么建议吗?
[编辑:这里是我的设置]
在settings.py(主要来自Django的conf/global_settings.py
复制):ioerr_filter.py的
DEBUG = False
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'ioerrsquash': {
'()': 'es.ioerr_filter.IOErrorFilter'
} },
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'filters': ['ioerrsquash']
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
'wsgi.errors': { # added this logger after django.request failed
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
}
}
}
内容(显然只是为了测试目的):
import logging
import sys
from django.conf import settings
class IOErrorFilter(logging.Filter):
def filter(self, record):
LOGF = "%s/BU_IOERR.log" % settings.LOG_FILE_DIR
f = open(LOGF, 'a')
f.write('... record\n')
f.write(str(record))
f.write('\n... exc_info\n')
f.write(str(sys.exc_info()))
f.write('\n...\n')
return True
感谢马克,是的,我用#17069作为日志过滤器的模板。正如我所提到的,我将过滤器附加到root和两个命名记录器(django.request) - 但我没有看到错误消失。在我的测试中,我删除了所有条件(例如'def filter(self,record):f = open('test.log','a'); f.write(str(record))')...和I查看其他日志消息,但不是IOError。 – EMiller 2012-02-22 17:06:30
如果您发布了您在日志配置和自定义过滤器代码方面尝试过的内容,这将会很有帮助。 – 2012-02-22 18:07:06
编辑的问题,谢谢 – EMiller 2012-02-23 14:45:35