I\'m running a Django site (via Apache/mod_python) and I use Django\'s facilities to inform me and other developers about internal server errors. Sometimes errors like those
You should be able to write a Middleware to catch the exception and you can then "silence" those specific exceptions.
https://docs.djangoproject.com/en/2.2/topics/http/middleware/
In django 1.3 and up, you can use a logging filter class to suppress the exceptions which you aren't interested in. Here's the logging filter class I'm using to narrowly suppress IOError exceptions raised from _get_raw_post_data():
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
In Django 1.4, you will be able to do away with most of the complexity and suppress the new exception class UnreadablePostError. (See this patch).
Extending the solution by @dlowe for Django 1.3, we can write the full working example as:
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