From 6afbd0d9fc04c776745796f604d56a56c4fec4bd Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Thu, 20 Dec 2018 15:57:19 -0800 Subject: [PATCH] logging: Implement colors for console messages Reviewed-by: James Valleroy --- plinth/log.py | 56 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/plinth/log.py b/plinth/log.py index 1ed8cdcfa..86059fec5 100644 --- a/plinth/log.py +++ b/plinth/log.py @@ -27,6 +27,53 @@ import cherrypy from . import cfg +class ColoredFormatter(logging.Formatter): + """Print parts of log message in color.""" + codes = { + 'black': 30, + 'red': 31, + 'green': 32, + 'yellow': 33, + 'blue': 34, + 'magenta': 35, + 'cyan': 36, + 'white': 37, + 'bright_black': 90, + 'bright_red': 91, + 'bright_green': 92, + 'bright_yellow': 93, + 'bright_blue': 94, + 'bright_magenta': 95, + 'bright_cyan': 96, + 'bright_white': 97 + } + + level_colors = { + 'DEBUG': 'bright_black', + 'INFO': 'bright_white', + 'WARNING': 'bright_yellow', + 'ERROR': 'red', + 'CRITICAL': 'bright_red' + } + + def wrap_color(self, string, color=None): + """Return a string wrapped in terminal escape codes for coloring.""" + if not color: + return string + + return '\x1b[{}m'.format(self.codes[color]) + string + '\x1b[0m' + + def format(self, record): + """Format a record into a string""" + record_name = '{:<20}'.format(record.name) + record.colored_name = self.wrap_color(record_name, 'bright_blue') + + level_color = self.level_colors.get(record.levelname, None) + level_name = '{:>8}'.format(record.levelname) + record.colored_levelname = self.wrap_color(level_name, level_color) + return super().format(record) + + def init(): """Setup the logging framework.""" # Remove default handlers and let the log message propagate to root logger. @@ -59,15 +106,16 @@ def get_configuration(): 'version': 1, 'disable_existing_loggers': False, 'formatters': { - 'default': { - 'format': - '%(name)-14s %(levelname)-8s %(message)s', + 'color': { + '()': 'plinth.log.ColoredFormatter', + 'format': '{colored_levelname} {colored_name} {message}', + 'style': '{' } }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', - 'formatter': 'default' + 'formatter': 'color' } }, 'root': {