Il y a quelque temps, j'ai vu une application Mono avec une sortie colorée, probablement à cause de son système de journalisation (car tous les messages étaient standardisés).
Maintenant, Python a le logging
module, qui vous permet de spécifier de nombreuses options pour personnaliser la sortie. Donc, j'imagine que quelque chose de similaire serait possible avec Python, mais je ne peux pas savoir comment faire cela n'importe où.
Existe-t-il un moyen de rendre la logging
sortie du module Python en couleur?
Ce que je veux (par exemple) des erreurs en rouge, des messages de débogage en bleu ou jaune, etc.
Bien sûr, cela nécessiterait probablement un terminal compatible (la plupart des terminaux modernes le sont); mais je pourrais revenir à la logging
sortie d' origine si la couleur n'est pas prise en charge.
Avez-vous des idées sur la façon d'obtenir une sortie colorée avec le module de journalisation?
Réponses:
Je connaissais déjà les fuites de couleur, je les ai utilisées dans mon invite bash il y a un moment. 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 que je me retrouve avec:
Et pour l'utiliser, créez votre propre enregistreur:
Juste au cas où quelqu'un d'autre en aurait besoin.
Soyez prudent si vous utilisez plusieurs enregistreurs ou gestionnaires:
ColoredFormatter
modifie l'objet d'enregistrement, qui est ensuite 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 journaux. Pour éviter cela, il est probablement préférable de simplement créer une copie derecord
aveccopy.copy()
avant de manipuler l'attribut levelname, ou de réinitialiser le levelname à la valeur précédente, avant de renvoyer la chaîne formatée (crédit à Michael dans les commentaires).la source
Formatter
et la spécification de son utilisation sur unStreamHandler
. Mais il n'y a pas besoin d'une sous-classe d'enregistreurs. En fait, l'utilisation d'une classe d'enregistreur ajoute un gestionnaire à chaque enregistreur créé, ce qui n'est généralement pas ce que vous souhaitez.ColoredFormatter
. Il 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 journaux. Pour éviter cela, il est probablement préférable de créer simplement une copie derecord
aveccopy.copy()
avant de manipuler l'attribut levelname, ou de réinitialiser le levelname à la valeur précédente, avant de renvoyer la chaîne formatée.Il y a des années, j'ai écrit un gestionnaire de flux coloré pour mon propre usage. Ensuite, je suis tombé sur cette page et j'ai trouvé une collection d'extraits de code que les gens copient / collent :-(. Mon gestionnaire de flux ne fonctionne actuellement que sous UNIX (Linux, Mac OS X) mais l'avantage est qu'il est disponible sur PyPI (et GitHub ) et il est très simple à utiliser. Il a également un mode de syntaxe Vim :-). À l'avenir, je pourrais l'étendre à Windows.
Pour installer le package:
Pour confirmer que cela fonctionne:
Pour commencer avec votre propre code:
Le format de journal par défaut indiqué dans l'exemple ci-dessus contient la date, l'heure, le nom d'hôte, le nom de l'enregistreur, le PID, le niveau de journal et le message de journal. Voici à quoi cela ressemble en pratique:
REMARQUE: lors de l'utilisation de Git Bash avec MinTTY
Git Bash sur Windows a quelques bizarreries documentées: Winpty et Git Bash
Avec lesquels pour les codes d'échappement ANSI et pour la réécriture de caractères de style ncurses et les animations, vous devez préfixer les commandes avec
winpty
.la source
AttributeError: 'module' object has no attribute 'install'
lors de l'utilisationcoloredlogs.install()
. Pouvez-vous confirmer cela avec la dernière version.logging.basicConfig()
etcoloredlogs.install()
installez un gestionnaire de flux qui se connecte à la console, donc sans "annuler", vous obtiendrez des messages en double ...coloredlogs.install
quel format utiliser, comme dans lecolorlog
paquet.Voici une solution qui devrait fonctionner sur n'importe quelle plate-forme. S'il ne me le dit pas, je le mettrai à jour.
Comment cela fonctionne: sur la plate-forme prenant en charge les échappements ANSI les utilise (non Windows) et sur Windows, il utilise des appels API pour changer les couleurs de la console.
Le script pirate la méthode logging.StreamHandler.emit de la bibliothèque standard en y ajoutant un wrapper.
TestColorer.py
Colorer.py
la source
args[1].msg = color + str(args[1].msg) + '\x1b[0m' # normal
.TestColorer.py
me préoccupe.Mise à jour : Parce que c'est une démangeaison que je voulais gratter depuis si longtemps, j'ai continué et j'ai écrit une bibliothèque pour les paresseux comme moi qui veulent juste des façons simples de faire les choses: zenlog
Colorlog est excellent pour cela. Il est disponible sur PyPI (et donc installable via
pip install colorlog
) et est activement maintenu .Voici un extrait rapide copiable et collable pour configurer la journalisation et imprimer des messages de journal d'apparence décente:
Production:
la source
setLevel
vraiment nécessaires?)Solution rapide et sale pour les niveaux de journal prédéfinis et sans définir de nouvelle classe.
la source
logging.basicConfig(format='%(asctime)s [%(name)s] [%(levelname)s] %(message)s')
où, bien sûr,%(levelnames)s
c'est important.echo -e "Normal texst \033[1;31mred bold text\033[0m normal text again"
. L'-e
option echo interprète "\ 033" comme une forme octale du symbole ASCII d'échappement. Ce symbole spécial fait que certains terminaux compatibles interprètent les caractères suivants (en charm
inclus) comme des commandes spéciales. en.wikipedia.org/wiki/ANSI_escape_codeif sys.sdterr.isatty():
. Dans ce cas, si vous redirigez la sortie vers un fichier, le fichier ne contiendra pas ces caractères d'échappement.Code 2020, aucun package supplémentaire requis, Python 3
Définir une classe
Instantiate logger
Et utilise!
Résultat
La palette de couleurs
Pour les fenêtres
Cette solution fonctionne sur Mac OS, terminaux IDE. On dirait que l'invite de commande de la fenêtre n'a pas de couleurs du tout par défaut. Voici des instructions pour les activer, que je n'ai pas essayé https://www.howtogeek.com/322432/how-to-customize-your-command-prompts-color-scheme-with-microsofts-colortool/
la source
←[38;21m2019-11-12 19:29:50,994 - My_app - DEBUG - debug message (test_colored_log.py:43)←[0m ←[38;21m2019-11-12 19:29:50,994 - My_app - INFO - info message (test_colored_log.py:44)←[0m ←[33;21m2019-11-12 19:29:50,994 - My_app - WARNING - warning message (test_colored_log.py:45)←[0m ←[31;21m2019-11-12 19:29:50,994 - My_app - ERROR - error message (test_colored_log.py:46)←[0m ←[31;1m2019-11-12 19:29:50,994 - My_app - CRITICAL - critical message (test_colored_log.py:47)←[0m
Eh bien, je suppose que je pourrais aussi bien ajouter ma variante de l'enregistreur de couleur.
Cela n'a rien d'extraordinaire, mais il est très simple à utiliser et ne modifie pas l'objet d'enregistrement, ce qui évite de consigner les séquences d'échappement ANSI dans un fichier journal si un gestionnaire de fichiers est utilisé. Cela n'affecte pas la mise en forme du message du journal.
Si vous utilisez déjà le formateur du module de journalisation , tout ce que vous avez à faire pour obtenir des noms de niveau colorés est de remplacer le formateur de vos gestionnaires de conseil par le ColoredFormatter. Si vous connectez une application entière, vous devez uniquement effectuer cette opération pour l'enregistreur de niveau supérieur.
colour_log.py
Exemple d'utilisation
app.py
sub_module.py
Résultats
Sortie borne
contenu app.log
Bien sûr, vous pouvez obtenir autant de fantaisie que vous le souhaitez en formatant le terminal et les sorties du fichier journal. Seul le niveau de journalisation sera colorisé.
J'espère que quelqu'un trouvera cela utile et ce n'est pas tout simplement trop pareil. :)
Les fichiers d'exemple Python peuvent être téléchargés à partir de ce GitHub Gist: https://gist.github.com/KurtJacobson/48e750701acec40c7161b5a2f79e6bfd
la source
return
:colored_record.msg = ('{0}{1}m{2}{3}').format(self.PREFIX, seq, colored_record.getMessage(), self.SUFFIX)
J'ai mis à jour l'exemple des balises supportant airmind pour le premier plan et l'arrière-plan. Utilisez simplement les variables de couleur $ BLACK - $ WHITE dans votre chaîne de formatage de journal. Pour définir l'arrière-plan, utilisez simplement $ BG-BLACK - $ BG-WHITE.
Alors maintenant, vous pouvez simplement faire ce qui suit dans votre fichier de configuration:
la source
super
ne s'applique qu'à une ancienne version de Python, je suppose? Étant donné que cette réponse date de 2010. Cela a bien fonctionné pour moi avec Python 2.7Vous pouvez importer le module Colorlog et l'utiliser
ColoredFormatter
pour coloriser les messages du journal.Exemple
Plaque de chaudière pour module principal:
Le code active uniquement les couleurs dans les messages de journal, si le module colorlog est installé et si la sortie est réellement envoyée à un terminal. Cela évite que les séquences d'échappement ne soient écrites dans un fichier lorsque la sortie du journal est redirigée.
En outre, un schéma de couleurs personnalisé est configuré qui convient mieux aux terminaux avec un fond sombre.
Quelques exemples d'appels de journalisation:
Production:
la source
colorlog.basicConfig
au lieu delogging.basicConfig
qui a de bonnes valeurs par défautRegardez la solution suivante. Le gestionnaire de flux devrait être la chose qui fait la coloration, alors vous avez la possibilité de colorier les mots plutôt que la ligne entière (avec le formateur).
http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html
la source
J'ai modifié l'exemple original fourni par Sorin et sous-classé StreamHandler en ColorizedConsoleHandler.
L'inconvénient de leur solution est qu'elle modifie le message, et parce que cela modifie le message de journal réel, tout autre gestionnaire recevra également le message modifié.
Cela a entraîné des fichiers journaux avec des codes couleur dans notre cas, car nous utilisons plusieurs enregistreurs.
La classe ci-dessous ne fonctionne que sur les plates-formes prenant en charge ansi, mais il devrait être trivial d'y ajouter les codes couleur de Windows.
la source
Il existe maintenant un module PyPi publié pour une sortie de journalisation colorée personnalisable:
https://pypi.python.org/pypi/rainbow_logging_handler/
et
https://github.com/laysakura/rainbow_logging_handler
Prise en charge de Windows
Prend en charge Django
Couleurs personnalisables
Comme il est distribué comme un œuf Python, il est très facile à installer pour n'importe quelle application Python.
la source
Il y a des tonnes de réponses. Mais personne ne parle de décorateurs. Voici donc le mien.
Parce que c'est beaucoup plus simple.
Il n'est pas nécessaire d'importer quoi que ce soit, ni d'écrire une sous-classe:
Cela définit les erreurs en rouge, les messages de débogage en bleu, etc. Comme demandé dans la question.
Nous pourrions même adapter le wrapper pour prendre un
color
argument pour définir dynamiquement la couleur du message en utilisantlogger.debug("message", color=GREY)
EDIT: Voici donc le décorateur adapté pour définir les couleurs lors de l'exécution:
la source
Un autre remix mineur de l'approche d'Airmind qui garde tout dans une classe:
Pour utiliser attacher le formateur à un gestionnaire, quelque chose comme:
la source
Un outil simple mais très flexible pour colorier N'IMPORTE QUEL texte terminal est « colout ».
Où tout texte dans la sortie de 'myprocess' qui correspond au groupe 1 de l'expression régulière sera coloré avec color1, groupe 2 avec color2, etc.
Par exemple:
c'est-à-dire que le premier groupe d'expression régulière (parens) correspond à la date initiale dans le fichier journal, le deuxième groupe correspond à un nom de fichier python, un numéro de ligne et un nom de fonction, et le troisième groupe correspond au message de journal qui vient après. J'utilise également une séquence parallèle de «gras / normaux» ainsi que la séquence de couleurs. Cela ressemble à ceci:
Notez que les lignes ou parties de lignes qui ne correspondent à aucun de mes regex sont toujours répercutées, donc ce n'est pas comme 'grep --color' - rien n'est filtré hors de la sortie.
De toute évidence, cela est suffisamment flexible pour que vous puissiez l'utiliser avec n'importe quel processus, et pas seulement avec des fichiers journaux. Habituellement, je prépare un nouveau regex à la volée chaque fois que je veux coloriser quelque chose. Pour cette raison, je préfère colout à tout outil de coloration de fichier journal personnalisé, car je n'ai besoin d'apprendre qu'un seul outil, indépendamment de ce que je colore: journalisation, sortie de test, syntaxe mettant en évidence des extraits de code dans le terminal, etc.
Cela évite également de vider les codes ANSI dans le fichier journal lui-même, ce qui à mon humble avis est une mauvaise idée, car cela cassera des choses comme la recherche de modèles dans le fichier journal, sauf si vous vous souvenez toujours de faire correspondre les codes ANSI dans votre expression régulière grep.
la source
la source
[9*m
codes des couleurs ANSI "vives"! PS votre dernière ligne me préoccupe un peu car on ne sait pas encore si la journalisation en dehors d'une définition de fonction est sûre en Python .Voici ma solution:
la source
Le problème avec lequel j'ai eu du mal était de configurer correctement le formateur:
Et puis utiliser:
la source
Bien que les autres solutions semblent bonnes, elles présentent certains problèmes. Certains colorent les lignes entières, ce qui n'est parfois pas souhaité et certains omettent toute configuration que vous pourriez avoir tous ensemble. La solution ci-dessous n'affecte rien d'autre que le message lui-même.
Code
Exemple
Production
Comme vous le voyez, tout le reste est toujours sorti et reste dans sa couleur initiale. Si vous souhaitez modifier autre chose que le message, vous pouvez simplement passer les codes de couleur à
log_format
dans l'exemple.la source
[17:01:36]:WARNING:this should be yellowthis should be yellow
ou une ligne complète imprimée deux fois?7s:%(message)s
dulog_format
.J'ai deux soumissions à ajouter, l'une colorise uniquement le message (ColoredFormatter) et l'autre colorise toute la ligne (ColorizingStreamHandler). Celles-ci incluent également plus de codes couleur ANSI que les solutions précédentes.
Certains contenus proviennent (avec modification) de: l'article ci-dessus et http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html .
Colorise le message uniquement:
Colorise toute la ligne:
la source
Je viens de répondre de la même manière à une question similaire: Python | changer la couleur du texte dans le shell
L'idée est d'utiliser la bibliothèque clint . Qui prend en charge les shells MAC, Linux et Windows (CLI).
la source
Il s'agit d'une énumération contenant les codes de couleur:
Cela peut être appliqué aux noms de chaque niveau de journal. Sachez qu'il s'agit d'un hack monstrueux.
Notez que votre formateur de journal doit inclure le nom du niveau de journal
par exemple:
la source
FriendlyLog est une autre alternative. Il fonctionne avec Python 2 & 3 sous Linux, Windows et MacOS.
la source
Qu'en est-il de surligner également les arguments du message avec des couleurs alternées, en plus de la coloration par niveau? J'ai récemment écrit un code simple pour cela. Un autre avantage est que l'appel de journal est effectué avec une mise en forme de type accolade Python 3. (
"{}"
).Voir le dernier code et les exemples ici: https://github.com/davidohana/colargulog
Exemple de code d'enregistrement:
Production:
La mise en oeuvre:
la source
Utilisez pyfancy .
Exemple:
la source
logging
fonctionnalité pour utiliser une bibliothèque de coloriage distincte.Juste une autre solution, aux couleurs de ZetaSyanthis:
appelez-le une fois depuis votre
__main__
fonction. J'ai quelque chose comme ça là-bas:il vérifie également que la sortie est une console, sinon aucune couleur n'est utilisée.
la source
Usage
Logger("File Name").info("This shows green text")
la source
La solution suivante fonctionne uniquement avec python 3, mais pour moi, cela semble plus clair.
L'idée est d'utiliser la fabrique d'enregistrements de journaux pour ajouter des attributs «colorés» aux journaux des objets d'enregistrement et d'utiliser ces attributs «colorés» au format de journal.
Vous pouvez facilement modifier cet exemple pour créer d'autres attributs colorés (par exemple, message_c), puis utiliser ces attributs pour obtenir du texte coloré (uniquement) où vous le souhaitez.
(astuce pratique que j'ai découverte récemment: j'ai un fichier avec des journaux de débogage colorés et chaque fois que je veux augmenter temporairement le niveau de journal de mon application, je viens
tail -f
du fichier journal dans un terminal différent et voir les journaux de débogage à l'écran sans changer de configuration et redémarrer l'application )la source
Ceci est une autre variante Python3 de l'exemple d'Airmind. Je voulais des fonctionnalités spécifiques que je ne voyais pas dans les autres exemples
Remarques: J'ai utilisé colorama mais vous pouvez le modifier afin que ce ne soit pas obligatoire. Aussi pour mes tests, je ne faisais qu'exécuter un fichier python, donc ma classe est dans le module.
__main__
Vous devrez changer(): __main__.ColoredFormatter
pour quel que soit votre module.logging.yaml
main.py
production:
la source