view pylons_app/lib/colored_formatter.py @ 153:a5a3bcc5ee89

Added colored formatter to project, and configs
author Marcin Kuzminski <marcin@python-works.com>
date Sun, 16 May 2010 15:06:20 +0200
parents
children 779dabcaae28
line wrap: on
line source

#import logging
## now we patch Python code to add color support to logging.StreamHandler
#def add_coloring_to_emit_windows(fn):
#        # add methods we need to the class
#    def _out_handle(self):
#        import ctypes
#        return ctypes.windll.kernel32.GetStdHandle(self.STD_OUTPUT_HANDLE)
#    out_handle = property(_out_handle)
#
#    def _set_color(self, code):
#        import ctypes
#        # Constants from the Windows API
#        self.STD_OUTPUT_HANDLE = -11
#        hdl = ctypes.windll.kernel32.GetStdHandle(self.STD_OUTPUT_HANDLE)
#        ctypes.windll.kernel32.SetConsoleTextAttribute(hdl, code)
#
#    setattr(logging.StreamHandler, '_set_color', _set_color)
#
#    def new(*args):
#        FOREGROUND_BLUE      = 0x0001 # text color contains blue.
#        FOREGROUND_GREEN     = 0x0002 # text color contains green.
#        FOREGROUND_RED       = 0x0004 # text color contains red.
#        FOREGROUND_INTENSITY = 0x0008 # text color is intensified.
#        FOREGROUND_WHITE     = FOREGROUND_BLUE|FOREGROUND_GREEN |FOREGROUND_RED
#       # winbase.h
#        STD_INPUT_HANDLE = -10
#        STD_OUTPUT_HANDLE = -11
#        STD_ERROR_HANDLE = -12
#
#        # wincon.h
#        FOREGROUND_BLACK     = 0x0000
#        FOREGROUND_BLUE      = 0x0001
#        FOREGROUND_GREEN     = 0x0002
#        FOREGROUND_CYAN      = 0x0003
#        FOREGROUND_RED       = 0x0004
#        FOREGROUND_MAGENTA   = 0x0005
#        FOREGROUND_YELLOW    = 0x0006
#        FOREGROUND_GREY      = 0x0007
#        FOREGROUND_INTENSITY = 0x0008 # foreground color is intensified.
#
#        BACKGROUND_BLACK     = 0x0000
#        BACKGROUND_BLUE      = 0x0010
#        BACKGROUND_GREEN     = 0x0020
#        BACKGROUND_CYAN      = 0x0030
#        BACKGROUND_RED       = 0x0040
#        BACKGROUND_MAGENTA   = 0x0050
#        BACKGROUND_YELLOW    = 0x0060
#        BACKGROUND_GREY      = 0x0070
#        BACKGROUND_INTENSITY = 0x0080 # background color is intensified.     
#
#        levelno = args[1].levelno
#        if(levelno>=50):
#            color = BACKGROUND_YELLOW | FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_INTENSITY 
#        elif(levelno>=40):
#            color = FOREGROUND_RED | FOREGROUND_INTENSITY
#        elif(levelno>=30):
#            color = FOREGROUND_YELLOW | FOREGROUND_INTENSITY
#        elif(levelno>=20):
#            color = FOREGROUND_GREEN
#        elif(levelno>=10):
#            color = FOREGROUND_MAGENTA
#        else:
#            color =  FOREGROUND_WHITE
#        args[0]._set_color(color)
#
#        ret = fn(*args)
#        args[0]._set_color( FOREGROUND_WHITE )
#        #print "after"
#        return ret
#    return new
#
#def add_coloring_to_emit_ansi(fn):
#    # add methods we need to the class
#    def new(*args):
#        levelno = args[1].levelno
#        if(levelno>=50):
#            color = '\x1b[31m' # red
#        elif(levelno>=40):
#            color = '\x1b[31m' # red
#        elif(levelno>=30):
#            color = '\x1b[33m' # yellow
#        elif(levelno>=20):
#            color = '\x1b[32m' # green 
#        elif(levelno>=10):
#            color = '\x1b[35m' # pink
#        else:
#            color = '\x1b[0m' # normal
#        args[1].msg = color + args[1].msg +  '\x1b[0m'  # normal
#        #print "after"
#        return fn(*args)
#    return new
#
#import platform
#if platform.system()=='Windows':
#    # Windows does not support ANSI escapes and we are using API calls to set the console color
#    logging.StreamHandler.emit = add_coloring_to_emit_windows(logging.StreamHandler.emit)
#else:
#    # all non-Windows platforms are supporting ANSI escapes so we use them
#    logging.StreamHandler.emit = add_coloring_to_emit_ansi(logging.StreamHandler.emit)
#    #log = logging.getLogger()
#    #log.addFilter(log_filter())
#    #//hdlr = logging.StreamHandler()
#    #//hdlr.setFormatter(formatter())

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