Print extra debug data in the logs.

This commit is contained in:
Valentin Lorentz 2013-02-03 17:46:39 +01:00
parent 49a392717e
commit d753df9d0c
2 changed files with 52 additions and 1 deletions

View File

@ -83,6 +83,7 @@ class Logger(logging.Logger):
eId = hex(hash(eStrId) & 0xFFFFF) eId = hex(hash(eStrId) & 0xFFFFF)
logging.Logger.exception(self, *args) logging.Logger.exception(self, *args)
self.error('Exception id: %s', eId) self.error('Exception id: %s', eId)
self.debug(utils.python.collect_extra_debug_data())
# The traceback should be sufficient if we want it. # The traceback should be sufficient if we want it.
# self.error('Exception string: %s', eStrId) # self.error('Exception string: %s', eStrId)

View File

@ -32,6 +32,7 @@ import sys
import types import types
import fnmatch import fnmatch
import threading import threading
import traceback
def universalImport(*names): def universalImport(*names):
"""Attempt to import the given modules, in order, returning the first """Attempt to import the given modules, in order, returning the first
@ -113,4 +114,53 @@ else:
def glob2re(g): def glob2re(g):
return fnmatch.translate(g)[:-7] return fnmatch.translate(g)[:-7]
# vim:set shiftwidth=4 softtabstop=8 expandtab textwidth=78:
# From http://code.activestate.com/recipes/52215-get-more-information-from-tracebacks/
def collect_extra_debug_data():
"""
Print the usual traceback information, followed by a listing of all the
local variables in each frame.
"""
data = ''
try:
tb = sys.exc_info()[2]
stack = []
while tb:
stack.append(tb.tb_frame)
tb = tb.tb_next
finally:
del tb
try:
from supybot.version import version
data += 'Supybot version: %s\n\n' % version
except:
data += '(Cannot get Supybot version.)\n\n'
data += 'Locals by frame, innermost last:\n'
for frame in stack:
data += '\n\n'
data += ('Frame %s in %s at line %s\n' % (frame.f_code.co_name,
frame.f_code.co_filename,
frame.f_lineno))
for key, value in frame.f_locals.items():
if key == '__builtins__':
# This is flooding
continue
data += ('\t%20s = ' % key)
#We have to be careful not to cause a new error in our error
#printer! Calling str() on an unknown object could cause an
#error we don't want.
try:
data += repr(value) + '\n'
except:
data += '<ERROR WHILE PRINTING VALUE>\n'
data += '\n'
data += '+-----------------------+\n'
data += '| End of locals display |\n'
data += '+-----------------------+\n'
data += '\n'
return data
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=78: