From patchwork Thu Aug 16 01:41:46 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [bitbake-devel] Add color to bitbake interactive console log formatter Date: Thu, 16 Aug 2012 01:41:46 -0000 From: Seth Bollinger X-Patchwork-Id: 34683 Message-Id: To: bitbake-devel@lists.openembedded.org Add bold color output to log level name and standard color output to log msg when bitbake is run from an iteractive console. Color output is only enabled if the terminal supports colors. --- lib/bb/msg.py | 40 ++++++++++++++++++++++++++++++++++++++++ lib/bb/ui/knotty.py | 6 +++++- 2 files changed, 45 insertions(+), 1 deletions(-) diff --git a/lib/bb/msg.py b/lib/bb/msg.py index 9b39325..51e335b 100644 --- a/lib/bb/msg.py +++ b/lib/bb/msg.py @@ -55,6 +55,25 @@ class BBLogFormatter(logging.Formatter): CRITICAL: 'ERROR', } + color_enabled = False + BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(30,38) + + COLORS = { + DEBUG3 : CYAN, + DEBUG2 : CYAN, + DEBUG : CYAN, + VERBOSE : WHITE, + NOTE : WHITE, + PLAIN : WHITE, + WARNING : YELLOW, + ERROR : RED, + CRITICAL: RED, + } + + BLD = '\033[1;%dm' + STD = '\033[%dm' + RST = '\033[0m' + def getLevelName(self, levelno): try: return self.levelnames[levelno] @@ -67,6 +86,8 @@ class BBLogFormatter(logging.Formatter): if record.levelno == self.PLAIN: msg = record.getMessage() else: + if self.color_enabled: + self.colorize(record) msg = logging.Formatter.format(self, record) if hasattr(record, 'bb_exc_info'): @@ -75,6 +96,25 @@ class BBLogFormatter(logging.Formatter): msg += '\n' + ''.join(formatted) return msg + def colorize(self, record): + color = self.COLORS[record.levelno] + if color is not None: + record.levelname = "".join([self.BLD % color, record.levelname, self.RST]) + record.msg = "".join([self.STD % color, record.msg, self.RST]) + + def enable_color(self): + import curses + try: + win = None + win = curses.initscr() + if curses.has_colors(): + self.color_enabled = True + except: + pass + finally: + if win is not None: + curses.endwin() + class BBLogFilter(object): def __init__(self, handler, level, debug_domains): self.stdlevel = level diff --git a/lib/bb/ui/knotty.py b/lib/bb/ui/knotty.py index 9f51823..a6f29a9 100644 --- a/lib/bb/ui/knotty.py +++ b/lib/bb/ui/knotty.py @@ -114,12 +114,16 @@ def main(server, eventHandler, tf = TerminalFilter): helper = uihelper.BBUIHelper() console = logging.StreamHandler(sys.stdout) - format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") + format_str = "%(levelname)s: %(message)s" + format = bb.msg.BBLogFormatter(format_str) + if interactive: + format.enable_color() bb.msg.addDefaultlogFilter(console) console.setFormatter(format) logger.addHandler(console) if consolelogfile: bb.utils.mkdirhier(os.path.dirname(consolelogfile)) + format = bb.msg.BBLogFormatter(format_str) consolelog = logging.FileHandler(consolelogfile) bb.msg.addDefaultlogFilter(consolelog) consolelog.setFormatter(format)