no need for bold error and critical messages, red is already enough

This commit is contained in:
Bernardo Damele 2012-07-12 14:54:05 +01:00
parent fe61bdce75
commit 64143a146f

View File

@ -18,22 +18,22 @@ class ColorizingStreamHandler(logging.StreamHandler):
'white': 7, 'white': 7,
} }
#levels to (background, foreground, bold/intense) # levels to (background, foreground, bold/intense)
if os.name == 'nt': if os.name == 'nt':
level_map = { level_map = {
logging.DEBUG: (None, 'blue', False), logging.DEBUG: (None, 'blue', False),
logging.INFO: (None, 'green', False), logging.INFO: (None, 'green', False),
logging.WARNING: (None, 'yellow', False), logging.WARNING: (None, 'yellow', False),
logging.ERROR: (None, 'red', True), logging.ERROR: (None, 'red', False),
logging.CRITICAL: ('red', 'white', True), logging.CRITICAL: ('red', 'white', False)
} }
else: else:
level_map = { level_map = {
logging.DEBUG: (None, 'blue', False), logging.DEBUG: (None, 'blue', False),
logging.INFO: (None, 'green', False), logging.INFO: (None, 'green', False),
logging.WARNING: (None, 'yellow', False), logging.WARNING: (None, 'yellow', False),
logging.ERROR: (None, 'red', True), logging.ERROR: (None, 'red', False),
logging.CRITICAL: ('red', 'white', True), logging.CRITICAL: ('red', 'white', False)
} }
csi = '\x1b[' csi = '\x1b['
reset = '\x1b[0m' reset = '\x1b[0m'
@ -47,11 +47,13 @@ class ColorizingStreamHandler(logging.StreamHandler):
try: try:
message = self.format(record) message = self.format(record)
stream = self.stream stream = self.stream
if not self.is_tty: if not self.is_tty:
stream.write(message) stream.write(message)
else: else:
self.output_colorized(message) self.output_colorized(message)
stream.write(getattr(self, 'terminator', '\n')) stream.write(getattr(self, 'terminator', '\n'))
self.flush() self.flush()
except (KeyboardInterrupt, SystemExit): except (KeyboardInterrupt, SystemExit):
raise raise
@ -83,19 +85,26 @@ class ColorizingStreamHandler(logging.StreamHandler):
write = self.stream.write write = self.stream.write
h = None h = None
fd = getattr(self.stream, 'fileno', None) fd = getattr(self.stream, 'fileno', None)
if fd is not None: if fd is not None:
fd = fd() fd = fd()
if fd in (1, 2): # stdout or stderr if fd in (1, 2): # stdout or stderr
h = ctypes.windll.kernel32.GetStdHandle(-10 - fd) h = ctypes.windll.kernel32.GetStdHandle(-10 - fd)
while parts: while parts:
text = parts.pop(0) text = parts.pop(0)
if text: if text:
write(text) write(text)
if parts: if parts:
params = parts.pop(0) params = parts.pop(0)
if h is not None: if h is not None:
params = [int(p) for p in params.split(';')] params = [int(p) for p in params.split(';')]
color = 0 color = 0
for p in params: for p in params:
if 40 <= p <= 47: if 40 <= p <= 47:
color |= self.nt_color_map[p - 40] << 4 color |= self.nt_color_map[p - 40] << 4
@ -107,41 +116,35 @@ class ColorizingStreamHandler(logging.StreamHandler):
color = 0x07 color = 0x07
else: else:
pass # error condition ignored pass # error condition ignored
ctypes.windll.kernel32.SetConsoleTextAttribute(h, color) ctypes.windll.kernel32.SetConsoleTextAttribute(h, color)
def colorize(self, message, record): def colorize(self, message, record):
if record.levelno in self.level_map: if record.levelno in self.level_map:
bg, fg, bold = self.level_map[record.levelno] bg, fg, bold = self.level_map[record.levelno]
params = [] params = []
if bg in self.color_map: if bg in self.color_map:
params.append(str(self.color_map[bg] + 40)) params.append(str(self.color_map[bg] + 40))
if fg in self.color_map: if fg in self.color_map:
params.append(str(self.color_map[fg] + 30)) params.append(str(self.color_map[fg] + 30))
if bold: if bold:
params.append('1') params.append('1')
if params: if params:
if message.lstrip() != message: if message.lstrip() != message:
prefix = re.search(r"\s+", message).group(0) prefix = re.search(r"\s+", message).group(0)
message = message[len(prefix):] message = message[len(prefix):]
else: else:
prefix = "" prefix = ""
message = "%s%s" % (prefix, ''.join((self.csi, ';'.join(params), message = "%s%s" % (prefix, ''.join((self.csi, ';'.join(params),
'm', message, self.reset))) 'm', message, self.reset)))
return message return message
def format(self, record): def format(self, record):
message = logging.StreamHandler.format(self, record) message = logging.StreamHandler.format(self, record)
return self.colorize(message, record) return self.colorize(message, record)
def main():
root = logging.getLogger()
root.setLevel(logging.DEBUG)
root.addHandler(ColorizingStreamHandler())
logging.debug('DEBUG')
logging.info('INFO')
logging.warning('WARNING')
logging.error('ERROR')
logging.critical('CRITICAL')
if __name__ == '__main__':
main()