Source code for ducky.log
import colorama
import logging
import tabulate
from six import print_
from functools import partial
LEVELS = {
logging.DEBUG: 'DEBG',
logging.INFO: 'INFO',
logging.WARNING: 'WARN',
logging.ERROR: 'ERRR',
logging.CRITICAL: 'CRIT'
}
COLORS = {
logging.DEBUG: colorama.Fore.WHITE,
logging.INFO: colorama.Fore.GREEN,
logging.WARNING: colorama.Fore.YELLOW,
logging.ERROR: colorama.Fore.RED,
logging.CRITICAL: colorama.Fore.RED
}
COLOR_RESET = colorama.Fore.RESET + colorama.Back.RESET + colorama.Style.RESET_ALL
[docs]class LogFormatter(logging.Formatter):
_default_format = '[{level}] {message}'
def __init__(self, format = None):
super(LogFormatter, self).__init__()
self._format = format or self._default_format
[docs] def double_fault(self, exc, record):
import sys
import traceback
print_('Failure in formatter:', file = sys.stderr)
print_('record: ' + str(record), file = sys.stderr)
print_('message: ' + str(record.msg), file = sys.stderr)
print_('args: ' + str(record.args), file = sys.stderr)
traceback.print_exc(file = sys.stderr)
sys.exit(1)
[docs] def _get_vars(self, record):
return {
'level': LEVELS[record.levelno],
'stamp': record.created
}
[docs] def format(self, record):
try:
vars = self._get_vars(record)
msg = [self._format.format(message = record.getMessage(), **vars)]
if record.exc_info is not None:
msg += [self._format.format(message = l, **vars) for l in self.formatException(record.exc_info).split('\n')]
return '\n'.join(msg)
except Exception as e:
self.double_fault(e, record)
[docs]class ColorizedLogFormatter(LogFormatter):
_default_format = '{color_start}[{level}]{color_end} {message}'
[docs] def _get_vars(self, record):
vars = super(ColorizedLogFormatter, self)._get_vars(record)
vars.update({
'color_start': COLORS[record.levelno],
'color_end': COLOR_RESET
})
return vars
[docs]class StreamHandler(logging.StreamHandler):
def __init__(self, formatter = None, *args, **kwargs):
super(StreamHandler, self).__init__(*args, **kwargs)
formatter = formatter or ColorizedLogFormatter()
self.setFormatter(formatter)
[docs]def create_logger(name = None, handler = None, level = logging.INFO):
name = name or 'ducky'
logger = logging.getLogger(name)
if handler:
logger.addHandler(handler)
def __table(table, fn = None, **kwargs):
fn = fn or logger.info
for line in tabulate.tabulate(table, headers = 'firstrow', tablefmt = 'simple', numalign = 'right', **kwargs).split('\n'):
fn(line)
logger.table = __table
logger.DEBUG = logger.debug
logger.setLevel(level)
return logger
get_logger = partial(logging.getLogger, 'ducky')