Skip to content

Commit e54bc48

Browse files
author
Jeff Balogh
committed
give me back my plain-text tracebacks (bug 638109)
1 parent c3c2f1a commit e54bc48

File tree

2 files changed

+90
-1
lines changed

2 files changed

+90
-1
lines changed

lib/admin_log.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
"""
2+
This is from Django utils/log.py 3fe4e7a2~1.
3+
"""
4+
import logging
5+
import sys
6+
from django.core import mail
7+
8+
# Make sure a NullHandler is available
9+
# This was added in Python 2.7/3.2
10+
try:
11+
from logging import NullHandler
12+
except ImportError:
13+
class NullHandler(logging.Handler):
14+
def emit(self, record):
15+
pass
16+
17+
# Make sure that dictConfig is available
18+
# This was added in Python 2.7/3.2
19+
try:
20+
from logging.config import dictConfig
21+
except ImportError:
22+
from django.utils.dictconfig import dictConfig
23+
24+
if sys.version_info < (2, 5):
25+
class LoggerCompat(object):
26+
def __init__(self, logger):
27+
self._logger = logger
28+
29+
def __getattr__(self, name):
30+
val = getattr(self._logger, name)
31+
if callable(val):
32+
def _wrapper(*args, **kwargs):
33+
# Python 2.4 logging module doesn't support 'extra' parameter to
34+
# methods of Logger
35+
kwargs.pop('extra', None)
36+
return val(*args, **kwargs)
37+
return _wrapper
38+
else:
39+
return val
40+
41+
def getLogger(name=None):
42+
return LoggerCompat(logging.getLogger(name=name))
43+
else:
44+
getLogger = logging.getLogger
45+
46+
# Ensure the creation of the Django logger
47+
# with a null handler. This ensures we don't get any
48+
# 'No handlers could be found for logger "django"' messages
49+
logger = getLogger('django')
50+
if not logger.handlers:
51+
logger.addHandler(NullHandler())
52+
53+
class AdminEmailHandler(logging.Handler):
54+
"""An exception log handler that emails log entries to site admins
55+
56+
If the request is passed as the first argument to the log record,
57+
request data will be provided in the
58+
"""
59+
def emit(self, record):
60+
import traceback
61+
from django.conf import settings
62+
63+
try:
64+
if sys.version_info < (2,5):
65+
# A nasty workaround required because Python 2.4's logging
66+
# module doesn't support passing in extra context.
67+
# For this handler, the only extra data we need is the
68+
# request, and that's in the top stack frame.
69+
request = record.exc_info[2].tb_frame.f_locals['request']
70+
else:
71+
request = record.request
72+
73+
subject = '%s (%s IP): %s' % (
74+
record.levelname,
75+
(request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS and 'internal' or 'EXTERNAL'),
76+
request.path
77+
)
78+
request_repr = repr(request)
79+
except:
80+
subject = 'Error: Unknown URL'
81+
request_repr = "Request repr() unavailable"
82+
83+
if record.exc_info:
84+
stack_trace = '\n'.join(traceback.format_exception(*record.exc_info))
85+
else:
86+
stack_trace = 'No stack trace available'
87+
88+
message = "%s\n\n%s" % (stack_trace, request_repr)
89+
mail.mail_admins(subject, message, fail_silently=True)

log_settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def emit(self, record):
5858
},
5959
'mail_admins': {
6060
'level': 'ERROR',
61-
'class': 'django.utils.log.AdminEmailHandler'
61+
'class': 'admin_log.AdminEmailHandler'
6262
},
6363
},
6464
'loggers': {

0 commit comments

Comments
 (0)