Python 抑制Django mod_wsgi IOErrors

Python 抑制Django mod_wsgi IOErrors,python,django,apache,mod-wsgi,Python,Django,Apache,Mod Wsgi,这些IOR错误是众所周知的,正如在其他SO线程(见下文)中所看到的那样,可能是由于用户在上传过程中关闭浏览器造成的。有关为什么没有简单解决方案的讨论,请参阅 我首先尝试了在对的回答中描述的中间件选项(在本例中除外,我将在请求uri上进行分支)。它不起作用:我可以捕获响应,并看到就Django而言,帖子中没有包含文件,它返回了一个带有验证错误的200响应。然而,我仍然可以在Apache的错误日志中看到IOError 接下来我们发现,这表明您应该使用日志记录过滤器来抑制这种情况。我尝试将过滤器附加到

这些IOR错误是众所周知的,正如在其他SO线程(见下文)中所看到的那样,可能是由于用户在上传过程中关闭浏览器造成的。有关为什么没有简单解决方案的讨论,请参阅

我首先尝试了在对的回答中描述的中间件选项(在本例中除外,我将在请求uri上进行分支)。它不起作用:我可以捕获响应,并看到就Django而言,帖子中没有包含文件,它返回了一个带有验证错误的200响应。然而,我仍然可以在Apache的错误日志中看到IOError

接下来我们发现,这表明您应该使用日志记录过滤器来抑制这种情况。我尝试将过滤器附加到我们的自定义记录器、根记录器和“django.request”。。。我还是看不到IOError来抑制它!我只能看到与表单验证失败相关的日志消息

有什么建议吗

[编辑:这是我的设置]

在settings.py(主要是从Django的
conf/global_settings.py
)中:

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


最近出现了一些问题,在trunk/1.4beta上这是一个
无法读取的PostError
。见和。您应该能够使用日志过滤器来抑制这些错误。#17069中有一个例子。

谢谢Mark,是的,我使用#17069作为日志过滤器的模板。正如我提到的,我将过滤器附加到root和两个命名的记录器(django.request)上,但我没有看到错误出现。在我的测试中,我删除了所有条件(例如,
def过滤器(self,record):f=open('test.log','a');f.write(str(record))
)。。。我看到了其他日志消息,但没有IOError。如果您发布了您在日志配置和自定义筛选代码方面所做的尝试,这将非常有用。
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