Je connaissais déjà les échappatoires de couleurs, je les ai utilisées dans mon invite bash il y a quelque temps. Merci quand même.
Ce que je voulais, c'était l'intégrer au module de journalisation, ce que j'ai finalement fait après quelques essais et erreurs.
Voici ce à quoi j'aboutis :
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)
Et pour l'utiliser, créez votre propre 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)
Juste au cas où quelqu'un d'autre en aurait besoin.
Faites attention si vous utilisez plus d'un enregistreur ou gestionnaire : ColoredFormatter
modifie l'objet d'enregistrement, qui est transmis à d'autres gestionnaires ou propagé à d'autres enregistreurs. Si vous avez configuré des enregistreurs de fichiers, etc., vous ne voulez probablement pas avoir les couleurs dans les fichiers d'enregistrement. Pour éviter cela, il est probablement mieux de créer simplement une copie de record
avec copy.copy()
avant de manipuler l'attribut levelname, ou pour réinitialiser le levelname à la valeur précédente, avant de retourner la chaîne formatée (crédit à Michael dans les commentaires).
1 votes
Vous devez préciser que vous souhaitez une solution multiplateforme - à la fois Linux et Windows.
1 votes
Relatif si vous utilisez Eclipse/PyDev : Coloriser les logs dans la console eclipse
7 votes
Peut-être pouvez-vous également utiliser colorlog
0 votes
Exécuter
pip install ipython
et ajouteralias python="ipython"
à votre shell de démarrage script (par ex.~/.bashrc
pour le shell bash)6 votes
Vous pouvez également essayer chromogène que j'ai écrit pour supporter tous les systèmes d'exploitation et toutes les versions de Python (2.7 et 3.*)
1 votes
Les solutions qui affichent les codes ANSI dans le fichier journal sont une mauvaise idée, elles vous surprendront lorsque vous chercherez quelque chose dans six mois et que vous oublierez de prendre en compte les caractères ANSI dans votre modèle regex. Il y a quelques solutions ci-dessous qui ajoutent la couleur au fur et à mesure que vous visualisez le journal, plutôt qu'au fur et à mesure que le journal est écrit...
0 votes
FriendlyLog ( github.com/SebiSebi/friendlylog ) est une autre alternative. Elle fonctionne avec Python 2 & 3 sous Linux, Windows et MacOS.
1 votes
@JonathanHartley C'est la raison pour laquelle il faut configurer plusieurs gestionnaires de journalisation. Vous pouvez configurer un gestionnaire de journalisation StreamHandler pour envoyer la sortie de journalisation vers des flux tels que sys.stdout et/ou sys.stderr. Le ou les gestionnaires émettant vers stdout/stderr peuvent être colorisés, cette sortie n'existe que dans une fenêtre de terminal. Vous configurez ensuite un autre gestionnaire de journalisation qui envoie la sortie de journalisation vers un fichier de journalisation (et ne colorie pas les messages).
0 votes
Vous n'avez même pas besoin de paquets pour y parvenir. stackoverflow.com/a/56944256/9150146
0 votes
Si vous voulez activer la couleur uniquement lorsque stdout est un terminal : stackoverflow.com/questions/1077113/