| ''' |
| Enables colored logger just by importing this module |
| ''' |
| |
| import sys |
| import logging |
| |
| def add_coloring_to_emit_windows(fn): |
| 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 |
| |
| if sys.stderr.isatty(): |
| if sys.platform.startswith('win'): |
| logging.StreamHandler.emit = add_coloring_to_emit_windows(logging.StreamHandler.emit) |
| else: |
| logging.StreamHandler.emit = add_coloring_to_emit_ansi(logging.StreamHandler.emit) |