Hi,
I attached a HandleExceptionMiddleware I use. You need to modify it
to your needs. It attaches the html page of cgitb and the django
debug page to the email.
Thomas
George Lund schrieb:
> We have a live server crash issues for which we are receiving emails
> from Django from our server, which is great.
>
> But I'm having trouble debugging the problem because the local
> variables don't seem to be included in the email. All I can see is
> call stack followed by a <WSGIRequest .. > object - but nothing else.
>
> Does anyone know how to make Django supply all the variables in the
> email?
>
--
Thomas Guettler, http://www.thomas-guettler.de/
E-Mail: guettli (*) thomas-guettler + de
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---
# -*- coding: iso-8859-1 -*-
# $Id: HandleExceptionMiddleware.py 246 2009-01-21 15:13:09Z tguettler $
# $HeadURL: svn+ssh://svnserver/svn/djangotools/trunk/middleware/HandleExceptionMiddleware.py $
# Python Imports
import os
import re
import logging
# Django
import django.http
from django.utils.encoding import force_unicode, smart_unicode
from django.conf import settings
from djangotools.utils import responseutils
EMAIL_HOST='localhost'
class HandleExceptionMiddleware:
def process_response(self, request, response):
if response.status_code in [404]: # "Page not found" ist für uns wie eine Exception
self.error(request, msg='Page not found')
return response
def process_exception(self, request, exception):
'''
Im Fehlerfall: Email an uns verschicken.
'''
if isinstance(exception, responseutils.HttpResponseException):
return exception.args[0]
logging.error('Exception: %r %r' % (request.path, request.user), exc_info=True)
logging.error(' GET: %s' % request.GET)
logging.error(' POST: %s' % request.POST)
#logging.info('connection.queries: %s' % connection.queries)
try:
self.error(request, exception)
except Exception:
logging.error('Fehler Email konnte nicht versendet werden: %s' % request.path,
exc_info=True)
def error(self, request, exception=None, msg=''):
exception_str=smart_unicode(exception, errors='replace')
logging.error('%s %r %r %r' % (
request.user, request.path, exception_str, msg))
import sys
import datetime
import django.views.debug
if request.user:
username=request.user.username
else:
username='user-unset'
exception_dir=os.path.join(settings.HOME, 'log', 'exceptions')
now=datetime.datetime.now()
body=[]
body.append(u'URL: %s' % (request.build_absolute_uri()))
body.append(u'Uhrzeit: %s' % now)
attachments=[]
msgs=[]
if exception:
msgs.append(exception_str)
try:
html=force_unicode(django.views.debug.technical_500_response(request, *sys.exc_info()), errors='replace')
attachments.append(('traceback-django.html', html, 'text/html'))
logfile=os.path.join(exception_dir, '%s-%s-django.html' % (
now.isoformat(), username))
fd=open(logfile, 'wt')
fd.write(html.encode('utf8'))
fd.close()
except UnicodeError, exc:
body.append(u'Django Debug Template failed: %s' % exc)
class FD:
def __init__(self):
self.content=[]
def write(self, text):
self.content.append(text)
def __str__(self):
return ''.join(self.content)
import cgitb
fd=FD()
cgitb.Hook(file=fd).handle()
html=str(fd)
attachments.append(('traceback-cgitb.html', html, 'text/html'))
logfile=os.path.join(exception_dir, '%s-%s-cgitb.html' % (
now.isoformat(), username))
fd=open(logfile, 'wt')
fd.write(html)
fd.close()
import traceback
import cStringIO
(exc_type, exc_value, tb) = sys.exc_info()
exc_file = cStringIO.StringIO()
traceback.print_exception(exc_type, exc_value, tb, file=exc_file)
body.append(u'Traceback:\n%s' % smart_unicode(exc_file.getvalue(), errors='replace'))
# Bei Entwicklungssystemen keine Fehleremail
# versenden.
if settings.DEVEL:
logging.info(' Versende keine Email, da settings.DEVEL gesetzt.')
return
from django.core import mail
for d in ['GET', 'POST', 'META']:
rows=[]
for key, value in sorted(getattr(request, d).items()):
rows.append('%s: %s' % (key, value))
body.append(u'%s:\n%s' % (d, '\n'.join(rows)))
body=u'\n\n'.join(body)
logfile=os.path.join(exception_dir, '%s-%s.txt' % (
now.isoformat(), username))
fd=open(logfile, 'wt')
fd.write(body.encode('utf8', 'replace'))
fd.close()
if msg:
msgs.append(msg)
msg=' '.join(msgs)
subject=u'Error %s %s %s %s: %s' % (
os.uname()[1], settings.DATABASE_NAME, username, request.path, msg)
subject=subject.replace('\n', ' ')
connection = mail.SMTPConnection(host=EMAIL_HOST)
to=[settings.ERROR_MAIL]
email=mail.EmailMessage(connection=connection,
subject=subject,
body=body,
to=to,
attachments=attachments)
try:
email.send()
except:
logging.error('Sending Mail failed: host: %s to: % subject: %s' % (
EMAIL_HOST, to, subject))