Created
May 15, 2015 15:01
-
-
Save KillerGoldFisch/990357a6ea927dca5f35 to your computer and use it in GitHub Desktop.
Colors the logger output based on the log-level. (Copy from http://stackoverflow.com/questions/384076/how-can-i-color-python-logging-output)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python | |
| # encoding: utf-8 | |
| # http://stackoverflow.com/questions/384076/how-can-i-color-python-logging-output | |
| 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_BLUE | |
| #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()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment