52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
import logging
|
|
import sys
|
|
import traceback
|
|
from collections import namedtuple
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
ErrorLog = namedtuple('ErrorLog', 'tracker errors')
|
|
|
|
|
|
def exc_info_to_str(exc_info):
|
|
"""Given some exception info, convert it into a string using
|
|
the traceback.format_exception() function.
|
|
"""
|
|
return ''.join(traceback.format_exception(*exc_info))
|
|
|
|
|
|
def in_exception_handler():
|
|
'''Is there an active exception?'''
|
|
return sys.exc_info() != (None, None, None)
|
|
|
|
|
|
def make_error_tracker():
|
|
'''Return an ErrorLog (named tuple), with fields (tracker, errors), where
|
|
the logger appends a tuple (message, exception_str) to the errors on every
|
|
call. exception_str is in the format returned by traceback.format_exception.
|
|
|
|
error_list is a simple list. If the caller modifies it, info
|
|
will be lost.
|
|
'''
|
|
errors = []
|
|
|
|
def error_tracker(msg):
|
|
'''Log errors'''
|
|
exc_str = ''
|
|
if in_exception_handler():
|
|
exc_str = exc_info_to_str(sys.exc_info())
|
|
|
|
# don't display irrelevant gunicorn sync error
|
|
if (('python2.7/site-packages/gunicorn/workers/sync.py' in exc_str) and
|
|
('[Errno 11] Resource temporarily unavailable' in exc_str)):
|
|
exc_str = ''
|
|
|
|
errors.append((msg, exc_str))
|
|
|
|
return ErrorLog(error_tracker, errors)
|
|
|
|
|
|
def null_error_tracker(msg):
|
|
'''A dummy error tracker that just ignores the messages'''
|
|
pass
|