Es gibt Unmengen von Antworten. Aber keiner spricht von Dekorateuren. Also hier ist meins.
Weil es viel einfacher ist.
Es ist nicht erforderlich, 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 in Rot, Debug-Meldungen in Blau usw. festgelegt. Wie in der Frage gestellt.
Wir könnten sogar den Wrapper anpassen, um einen zu nehmen color
Argument für die dynamische Einstellung der Farbe der Nachricht zu verwendenlogger.debug("message", color=GREY)
EDIT: Also hier ist der angepasste Dekorateur, um Farben zur Laufzeit einzustellen:
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)