Source

RhodeCode / rhodecode / lib / colored_formatter.py

Full commit

import logging

BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = xrange(30, 38)

# Sequences 
RESET_SEQ = "\033[0m"
COLOR_SEQ = "\033[1;%dm"
BOLD_SEQ = "\033[1m"

COLORS = {
    'CRITICAL': MAGENTA, # level 50
    'ERROR': RED, # level 40
    'WARNING': CYAN, # level 30
    'INFO': GREEN, # level 20
    'DEBUG': BLUE, # level 10
}

class ColorFormatter(logging.Formatter):

    def __init__(self, *args, **kwargs):
        # can't do super(...) here because Formatter is an old school class
        logging.Formatter.__init__(self, *args, **kwargs)

    def format(self, record):
        """
        Changes record's levelname to use with COLORS enum
        """
        
        levelname = record.levelname
        start = COLOR_SEQ % (COLORS[levelname])
        def_record = logging.Formatter.format(self, record)
        end = RESET_SEQ
        
        colored_record = start + def_record + end
        return colored_record

logging.ColorFormatter = ColorFormatter