colored_formatter.py
141 lines
| 4.8 KiB
| text/x-python
|
PythonLexer
r153 | #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 | ||||