#logging #python

Sometimes, you just want to color the output of the logging package in Python.

Here's a simple custom formatter which shows how this can be done:

 1import logging
 2
 3class ColorFormatter(logging.Formatter):
 4    """Logging Formatter to add colors and count warning / errors"""
 5
 6    grey   = "\x1b[90m"
 7    green  = "\x1b[92m"
 8    yellow = "\x1b[93m"
 9    red    = "\x1b[91m"
10    reset  = "\x1b[0m"
11    format = "%(asctime)s | %(levelname)-5.5s | %(message)s"
12
13    FORMATS = {
14        logging.DEBUG: grey + format + reset,
15        logging.INFO: green + format + reset,
16        logging.WARNING: yellow + format + reset,
17        logging.ERROR: red + format + reset,
18        logging.CRITICAL: red + format + reset
19    }
20
21    def format(self, record):
22        record.levelname = 'WARN' if record.levelname == 'WARNING' else record.levelname
23        record.levelname = 'ERROR' if record.levelname == 'CRITICAL' else record.levelname
24        log_fmt = self.FORMATS.get(record.levelno)
25        formatter = logging.Formatter(log_fmt)
26        return formatter.format(record)
27
28def configure_logging():
29
30    logger = logging.getLogger()
31    logger.setLevel(logging.DEBUG)
32
33    ch = logging.StreamHandler()
34    ch.setLevel(logging.DEBUG)
35    ch.setFormatter(ColorFormatter())
36    logger.addHandler(ch)
37
38def main():
39
40    configure_logging()
41
42    logging.debug("debug message")
43    logging.info("info message")
44    logging.warning("warning message")
45    logging.error("error message")
46    logging.critical("critical message")
47
48if __name__ == "__main__":
49    main()