Es gibt eine Vielzahl von Antworten. Aber keine spricht über Dekorateure. Also hier ist meine.
Weil es viel einfacher ist.
Es ist nicht nötig, etwas zu importieren oder eine Unterklasse zu schreiben:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
NO_COLOR = "\33[m"
RED, GREEN, ORANGE, BLUE, PURPLE, LBLUE, GREY = \
map("\33[%dm".__mod__, range(31, 38))
logging.basicConfig(format="%(message)s", level=logging.DEBUG)
logger = logging.getLogger(__name__)
# the decorator to apply on the logger methods info, warn, ...
def add_color(logger_method, color):
def wrapper(message, *args, **kwargs):
return logger_method(
# the coloring is applied here.
color+message+NO_COLOR,
*args, **kwargs
)
return wrapper
for level, color in zip((
"info", "warn", "error", "debug"), (
GREEN, ORANGE, RED, BLUE
)):
setattr(logger, level, add_color(getattr(logger, level), color))
# this is displayed in red.
logger.error("Launching %s." % __file__)
Dadurch werden die Fehler rot, die Fehlermeldungen blau usw. angezeigt. Wie in der Frage gefragt.
Wir könnten den Wrapper sogar so anpassen, dass er eine color
Argument, um die Farbe der Nachricht dynamisch einzustellen, indem man logger.debug("message", color=GREY)
EDIT: Hier ist also der angepasste Dekorator, um Farben zur Laufzeit zu setzen:
def add_color(logger_method, _color):
def wrapper(message, *args, **kwargs):
color = kwargs.pop("color", _color)
if isinstance(color, int):
color = "\33[%dm" % color
return logger_method(
# the coloring is applied here.
color+message+NO_COLOR,
*args, **kwargs
)
return wrapper
# blah blah, apply the decorator...
# this is displayed in red.
logger.error("Launching %s." % __file__)
# this is displayed in blue
logger.error("Launching %s." % __file__, color=34)
# and this, in grey
logger.error("Launching %s." % __file__, color=GREY)