57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
|
import logging
|
||
|
from django.core import mail
|
||
|
|
||
|
# Make sure a NullHandler is available
|
||
|
# This was added in Python 2.7/3.2
|
||
|
try:
|
||
|
from logging import NullHandler
|
||
|
except ImportError:
|
||
|
class NullHandler(logging.Handler):
|
||
|
def emit(self, record):
|
||
|
pass
|
||
|
|
||
|
# Make sure that dictConfig is available
|
||
|
# This was added in Python 2.7/3.2
|
||
|
try:
|
||
|
from logging.config import dictConfig
|
||
|
except ImportError:
|
||
|
from django.utils.dictconfig import dictConfig
|
||
|
|
||
|
# Ensure the creation of the Django logger
|
||
|
# with a null handler. This ensures we don't get any
|
||
|
# 'No handlers could be found for logger "django"' messages
|
||
|
logger = logging.getLogger('django')
|
||
|
if not logger.handlers:
|
||
|
logger.addHandler(NullHandler())
|
||
|
|
||
|
class AdminEmailHandler(logging.Handler):
|
||
|
"""An exception log handler that emails log entries to site admins
|
||
|
|
||
|
If the request is passed as the first argument to the log record,
|
||
|
request data will be provided in the
|
||
|
"""
|
||
|
def emit(self, record):
|
||
|
import traceback
|
||
|
from django.conf import settings
|
||
|
|
||
|
try:
|
||
|
request = record.request
|
||
|
|
||
|
subject = '%s (%s IP): %s' % (
|
||
|
record.levelname,
|
||
|
(request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS and 'internal' or 'EXTERNAL'),
|
||
|
request.path
|
||
|
)
|
||
|
request_repr = repr(request)
|
||
|
except:
|
||
|
subject = 'Error: Unknown URL'
|
||
|
request_repr = "Request repr() unavailable"
|
||
|
|
||
|
if record.exc_info:
|
||
|
stack_trace = '\n'.join(traceback.format_exception(*record.exc_info))
|
||
|
else:
|
||
|
stack_trace = 'No stack trace available'
|
||
|
|
||
|
message = "%s\n\n%s" % (stack_trace, request_repr)
|
||
|
mail.mail_admins(subject, message, fail_silently=True)
|