Added a nice little exception id system based on the idea in Mongoose <http://themongoose.sf.net/> for easier tracking of bugz0rs.

This commit is contained in:
Jeremy Fincher 2004-05-07 12:36:57 +00:00
parent faa5a8ce13
commit 9100151f95

View File

@ -39,6 +39,8 @@ import time
import types import types
import atexit import atexit
import logging import logging
import operator
import traceback
import ansi import ansi
import conf import conf
@ -58,6 +60,17 @@ class Formatter(logging.Formatter):
return logging.Formatter.formatException(self, (E, e, tb)) return logging.Formatter.formatException(self, (E, e, tb))
class Logger(logging.Logger):
def exception(self, *args):
(E, e, tb) = sys.exc_info()
tbinfo = traceback.extract_tb(tb)
path = '/'.join(map(operator.itemgetter(2), tbinfo))
eStrId = '%s:%s' % (E, path)
eId = hash(eStrId) & 0xFFFF
logging.Logger.exception(self, *args)
self.error('Exception id: %s', eId)
self.error('Exception string: %s', eStrId)
class BetterStreamHandler(logging.StreamHandler): class BetterStreamHandler(logging.StreamHandler):
def emit(self, record): def emit(self, record):
msg = self.format(record) msg = self.format(record)
@ -107,7 +120,7 @@ class BetterFileHandler(logging.FileHandler):
class ColorizedFormatter(Formatter): class ColorizedFormatter(Formatter):
def formatException(self, (E, e, tb)): def formatException(self, (E, e, tb)):
if conf.supybot.log.stdout.colorized(): if conf.supybot.log.stdout.colorized():
return ''.join([ansi.BOLD, ansi.RED, return ''.join([ansi.RED,
Formatter.formatException(self, (E, e, tb)), Formatter.formatException(self, (E, e, tb)),
ansi.RESET]) ansi.RESET])
else: else:
@ -133,6 +146,7 @@ formatter = Formatter('%(levelname)s %(asctime)s %(message)s')
pluginFormatter = Formatter('%(levelname)s %(asctime)s %(name)s %(message)s') pluginFormatter = Formatter('%(levelname)s %(asctime)s %(name)s %(message)s')
# These are not. # These are not.
logging.setLoggerClass(Logger)
_logger = logging.getLogger('supybot') _logger = logging.getLogger('supybot')
debug = _logger.debug debug = _logger.debug
info = _logger.info info = _logger.info
@ -272,16 +286,17 @@ registry.String('[%d-%b-%Y %H:%M:%S]',
Python documentation for the time module to see what formats are accepted. Python documentation for the time module to see what formats are accepted.
If you set this variable to the empty string, times will be logged in a If you set this variable to the empty string, times will be logged in a
simple seconds-since-epoch format.""")) simple seconds-since-epoch format."""))
if not os.path.exists(conf.supybot.directories.log()):
os.mkdir(conf.supybot.directories.log(), 0755)
pluginLogDir = os.path.join(conf.supybot.directories.log(), 'plugins') _logDir = conf.supybot.directories.log()
if not os.path.exists(_logDir):
os.mkdir(_logDir, 0755)
pluginLogDir = os.path.join(_logDir, 'plugins')
if not os.path.exists(pluginLogDir): if not os.path.exists(pluginLogDir):
os.mkdir(pluginLogDir, 0755) os.mkdir(pluginLogDir, 0755)
_handler = BetterFileHandler(os.path.join(conf.supybot.directories.log(), _handler = BetterFileHandler(os.path.join(_logDir, 'misc.log'))
'misc.log'))
_handler.setFormatter(formatter) _handler.setFormatter(formatter)
_handler.setLevel(-1) _handler.setLevel(-1)
_logger.addHandler(_handler) _logger.addHandler(_handler)