App Engine Tracebacks via E-Mail
Django’s error reporting via e-mail is something I’ve missed for my App Engine applications. If you’ve followed the instructions on how to use Django on App Engine errors are already logged. But honestly, I don’t check the logs very often and sometimes it’s just a silly typo that’s fixed in a minute ;-)
So if you’ve followed the instructions you can simply extend the log_exception function to send an email after the exception is logged:
def log_exception(*args, **kwds): """Django signal handler to log an exception.""" excinfo = sys.exc_info() cls, err = excinfo[:2] subject = 'Exception in request: %s: %s' % (cls.__name__, err) logging.exception(subject) # Send an email to the admins if 'request' in kwds: try: repr_request = repr(kwds['request']) except: repr_request = 'Request repr() not available.' else: repr_request = 'Request not available.' msg = ('Application: %s\nVersion: %s\n\n%s\n\n%s' % (os.getenv('APPLICATION_ID'), os.getenv('CURRENT_VERSION_ID'), ''.join(traceback.format_exception(*excinfo)), repr_request)) subject = '[%s] %s' % (os.getenv('APPLICATION_ID'), subject) mail.send_mail_to_admins('APP_ADMIN@EXAMPLE.COM', subject, msg)
Make sure to replace “APP_ADMIN@EXAMPLE.COM” with the email address of an admin for this application and to add these two imports somewhere at the top of your main.py:
import traceback from google.appengine.api import mail
You don’t need to comment this when developing your app to avoid lots of useless mails. The dev server doesn’t fully implement send_mail_to_admins() most likely as there’s no real concept of an designated admin user in the SDK. It just writes a short message to the log, even if the sendmail option is enabled.
P.s.: If you use webapp instead of Django have a look at the seventh slide of this presentation by Ken Ashcraft. He shows a similar implementation for webapp based applications.