logging es un módulo de la librería estándar de Python para “imprimir” mensajes de log. En esta receta se explica cómo conseguir que cada tipo de mensaje aparezca en consola con un color diferente.

Ingredientes

  • Python

Introducción

logging es un módulo muy flexible, es thread-safe, permite especificar la gravedad de cada mensaje, filtrar mensajes por debajo del umbral deseado, crear varios “loggers” para distintos propósitos dentro del programa, enviar los mensajes a un fichero, por un socket, con correo electrónico y mil cosas más.

Por su diseño orientado a objetos, es muy sencillo crear nuevas maneras de formatear los mensajes, niveles, manejadores y casi cualquier cosa que puedan necesitar de un sistema de logging. En esta receta voy a hacer una clase Formatter para usar en la consola.

La clase ColorFormatter

Como suele ocurrir en Python, el código es tan simple que resulta insultante:

import logging

class ColorFormatter(logging.Formatter):

    def color(self, level=None):
        codes = {\
            None:       (0,   0),
            'DEBUG':    (0,   2), # gris
            'INFO':     (0,   0), # normal
            'WARNING':  (1,  34), # azul
            'ERROR':    (1,  31), # rojo
            'CRITICAL': (1, 101), # negro, fondo rojo
            }
        return (chr(27)+'[%d;%dm') % codes[level]

    def format(self, record):
        retval = logging.Formatter.format(self, record)
        return self.color(record.levelname) + retval + self.color()

Y un ejemplo de uso

import logging

console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
console.setFormatter(ColorFormatter('    %(levelname)s[%(name)s]: %(message)s'))
logging.getLogger().addHandler(console)

logging.debug('mensaje para depuración')
logging.info('información')
logging.warning('el que avisa no es traidor')
logging.error('un errorcillo')
logging.critical('y la liaste parda')


blog comments powered by Disqus