我正在运行一个Django站点(通过Apache / mod_python),我使用Django的工具来通知我和其他开发人员有关内部服务器错误的信息。有时出现错误:
Traceback (most recent call last):
File "/opt/webapp/externals/lib/django/core/handlers/base.py", line 92, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "/opt/webapp/csite/apps/customers/views.py", line 29, in feedback
form = FeedbackForm(request.POST)
File "/opt/webapp/externals/lib/django/core/handlers/modpython.py", line 113, in _get_post
self._load_post_and_files()
File "/opt/webapp/externals/lib/django/core/handlers/modpython.py", line 96, in _load_post_and_files
self._post, self._files = http.QueryDict(self.raw_post_data, encoding=self._encoding), datastructures.MultiValueDict()
File "/opt/webapp/externals/lib/django/core/handlers/modpython.py", line 163, in _get_raw_post_data
self._raw_post_data = self._req.read()
IOError: Client read error (Timeout?)
据我所知,那些IOError
是由错误时刻断开连接的客户端生成的,并且这不是我网站的问题。
如果是这种情况:我可以以某种方式禁用这些错误的电子邮件吗?我真的不想知道我无法解决的错误,也不是真正的错误。
答案 0 :(得分:11)
通过@dlowe为Django 1.3扩展解决方案,我们可以将完整的工作示例编写为:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'supress_unreadable_post': {
'()': 'common.logging.SuppressUnreadablePost',
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'filters': ['supress_unreadable_post'],
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
import sys, traceback
class SuppressUnreadablePost(object):
def filter(self, record):
_, exception, tb = sys.exc_info()
if isinstance(exception, IOError):
for _, _, function, _ in traceback.extract_tb(tb):
if function == '_get_raw_post_data':
return False
return True
答案 1 :(得分:2)
您应该能够编写一个中间件来捕获异常,然后您可以“沉默”这些特定异常。
http://docs.djangoproject.com/en/1.1/topics/http/middleware/#process-exception
答案 2 :(得分:2)
在django 1.3及更高版本中,您可以使用logging filter类来抑制您不感兴趣的异常。这是我用来简化抑制从{{1引发的IOError异常的日志记录过滤器类}}:
_get_raw_post_data()
在Django 1.4中,您将能够消除大部分复杂性并抑制新的异常类import sys, traceback
class _SuppressUnreadablePost(object):
def filter(self, record):
_, exception, tb = sys.exc_info()
if isinstance(exception, IOError):
for _, _, function, _ in traceback.extract_tb(tb):
if function == '_get_raw_post_data':
return False
return True
。 (见this patch)。