Ich wusste bereits über die Farbe Escapes, ich habe sie in meinem Bash Prompt vor einer Weile verwendet. Trotzdem danke.
Was ich wollte, war die Integration mit dem Logging-Modul, was ich nach einigen Versuchen und Fehlern schließlich geschafft habe.
Das ist mein Ergebnis:
BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)
#The background is set with 40 plus the number of the color, and the foreground with 30
#These are the sequences need to get colored ouput
RESET_SEQ = "\033[0m"
COLOR_SEQ = "\033[1;%dm"
BOLD_SEQ = "\033[1m"
def formatter_message(message, use_color = True):
if use_color:
message = message.replace("$RESET", RESET_SEQ).replace("$BOLD", BOLD_SEQ)
else:
message = message.replace("$RESET", "").replace("$BOLD", "")
return message
COLORS = {
'WARNING': YELLOW,
'INFO': WHITE,
'DEBUG': BLUE,
'CRITICAL': YELLOW,
'ERROR': RED
}
class ColoredFormatter(logging.Formatter):
def __init__(self, msg, use_color = True):
logging.Formatter.__init__(self, msg)
self.use_color = use_color
def format(self, record):
levelname = record.levelname
if self.use_color and levelname in COLORS:
levelname_color = COLOR_SEQ % (30 + COLORS[levelname]) + levelname + RESET_SEQ
record.levelname = levelname_color
return logging.Formatter.format(self, record)
Und um es zu benutzen, erstellen Sie Ihren eigenen Logger:
# Custom logger class with multiple destinations
class ColoredLogger(logging.Logger):
FORMAT = "[$BOLD%(name)-20s$RESET][%(levelname)-18s] %(message)s ($BOLD%(filename)s$RESET:%(lineno)d)"
COLOR_FORMAT = formatter_message(FORMAT, True)
def __init__(self, name):
logging.Logger.__init__(self, name, logging.DEBUG)
color_formatter = ColoredFormatter(self.COLOR_FORMAT)
console = logging.StreamHandler()
console.setFormatter(color_formatter)
self.addHandler(console)
return
logging.setLoggerClass(ColoredLogger)
Nur für den Fall, dass jemand anderes es braucht.
Seien Sie vorsichtig, wenn Sie mehr als einen Logger oder Handler verwenden: ColoredFormatter
ist die Änderung des Datensatzobjekts, das an andere Handler weitergegeben oder an andere Logger propagiert wird. Wenn Sie Dateilogger usw. konfiguriert haben, möchten Sie wahrscheinlich nicht, dass die Farben in den Protokolldateien angezeigt werden. Um das zu vermeiden, ist es wahrscheinlich am besten, einfach eine Kopie von record
con copy.copy()
bevor das Attribut levelname manipuliert wird, oder um den levelname auf den vorherigen Wert zurückzusetzen, bevor die formatierte Zeichenkette zurückgegeben wird (Dank an Michael in den Kommentaren).