抑制Django mod_wsgi IOErrors

时间:2012-02-22 16:33:42

标签: python django apache mod-wsgi

这些IOErrors是众所周知的,如其他SO线程(见下文)所示,并且可能是由用户在上传中间关闭浏览器引起的。有关没有简单解决方案的原因的讨论,请参阅this django-developers thread

我首先尝试了对this ioerror SO thread的回答中描述的中间件选项(除了在我们的例子中,我将分支请求uri)。 它没有工作:我可以捕获响应并看到就Django而言,帖子中没有包含' ta文件,并且它返回了200响应验证错误。 然而,我仍然可以在Apache的错误日志中看到IOError。

接下来我们发现this discussion on a django bug,建议您使用记录过滤器来抑制此问题。我尝试将过滤器附加到我们的自定义记录器,根记录器和' django.request' ...我无法看到IOError来抑制它!我只能看到与表单验证失败相关的日志消息。

有什么建议吗?

[编辑:这是我的设置]

在settings.py中(主要是从Django' s conf/global_settings.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,
       }
    }
}

ioerr_filter.py的内容(显然仅用于测试目的):

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

1 个答案:

答案 0 :(得分:0)

最近有一些问题,现在在trunk / 1.4beta上将其作为UnreadablePostError引发。请参阅https://code.djangoproject.com/ticket/17277https://code.djangoproject.com/ticket/17069。您应该能够使用日志记录筛选器来抑制这些错误。 #17069中有一个例子。