Mercurial > kallithea
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pylons_app/lib/colored_formatter.py Sun May 16 15:06:20 2010 +0200 @@ -0,0 +1,141 @@ +#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