Fantaisies programatico-ludiques

Colored logs in Python

Disclaimer: this post was heaviliy inspired by the 2 following gists:

I loved the simplicity of the first, not having to manipulate any of the logging internal API, but I prefer colorama over termcolor.

Without further ado, there is my solution :

import logging, sys
from colorama import Back, Fore, Style

LOG_FORMAT = "%(asctime)s - pid:%(process)s %(filename)s:%(lineno)d %(levelname)8s| %(message)s"

class ColorLogsWrapper(object):
    COLOR_MAP = {
        'debug': Fore.CYAN,
        'info': Fore.GREEN,
        'warning': Fore.YELLOW,
        'error': Fore.RED,
        'critical': Back.RED,

    def __init__(self, logger):
        self.logger = logger

    def __getattr__(self, attr_name):
        if attr_name == 'warn':
            attr_name = 'warning'
        if attr_name not in 'debug info warning error critical':
            return getattr(self.logger, attr_name)
        log_level = getattr(logging, attr_name.upper())
         # mimicking logging/ behaviour
        if not self.logger.isEnabledFor(log_level):

        def wrapped_attr(msg, *args, **kwargs):
            style_prefix = self.COLOR_MAP[attr_name]
            msg = style_prefix + msg + Style.RESET_ALL
            # We call _.log directly to not increase the callstack
            # so that Logger.findCaller extract the corrects filename/lineno
            return self.logger._log(log_level, msg, args, **kwargs)
        return wrapped_attr

logging.basicConfig(stream=sys.stderr, format=LOG_FORMAT, level=logging.DEBUG)
LOGGER = ColorLogsWrapper(logging.getLogger(__name__))


$ py
2015-02-17 10:38:04,802 - pid:16089    DEBUG| Debug
2015-02-17 10:38:04,802 - pid:16089     INFO| Info
2015-02-17 10:38:04,802 - pid:16089  WARNING| Warning
2015-02-17 10:38:04,802 - pid:16089    ERROR| Error
2015-02-17 10:38:04,802 - pid:16089 CRITICAL| Critical

Could Work. You won't know if you don't try.