Vor einiger Zeit habe ich eine Mono-Anwendung mit farbiger Ausgabe gesehen, vermutlich aufgrund ihres Protokollsystems (weil alle Nachrichten standardisiert waren).
Jetzt verfügt Python über das logging
Modul, mit dem Sie viele Optionen zum Anpassen der Ausgabe angeben können. Ich stelle mir also vor, dass mit Python etwas Ähnliches möglich wäre, aber ich kann nirgendwo herausfinden, wie das geht.
Gibt es eine Möglichkeit, das Python- logging
Modul in Farbe auszugeben?
Was ich will (zum Beispiel) Fehler in Rot, Debug-Nachrichten in Blau oder Gelb und so weiter.
Natürlich würde dies wahrscheinlich ein kompatibles Terminal erfordern (die meisten modernen Terminals sind es); Ich könnte jedoch auf die ursprüngliche logging
Ausgabe zurückgreifen, wenn die Farbe nicht unterstützt wird.
Irgendwelche Ideen, wie ich mit dem Protokollierungsmodul eine farbige Ausgabe erhalten kann?
Antworten:
Ich wusste bereits über die Farbentweichungen Bescheid, ich habe sie vor einiger Zeit in meiner Bash-Eingabeaufforderung verwendet. Danke trotzdem.
Ich wollte es in das Protokollierungsmodul integrieren, was ich schließlich nach ein paar Versuchen und Fehlern tat.
Folgendes habe ich am Ende:
Und um es zu verwenden, erstellen Sie Ihren eigenen Logger:
Nur für den Fall, dass es jemand anderes braucht.
Seien Sie vorsichtig, wenn Sie mehr als einen Logger oder Handler verwenden:
ColoredFormatter
Ändert das Datensatzobjekt, das weiter an andere Handler übergeben oder an andere Logger weitergegeben wird. Wenn Sie Dateiprotokollierer usw. konfiguriert haben, möchten Sie wahrscheinlich nicht, dass die Farben in den Protokolldateien enthalten sind. Um dies zu vermeiden, ist es wahrscheinlich am besten, einfach eine Kopie vonrecord
mit zu erstellen,copy.copy()
bevor Sie das Attribut levelname bearbeiten, oder den Ebenennamen auf den vorherigen Wert zurückzusetzen, bevor Sie die formatierte Zeichenfolge zurückgeben (Gutschrift an Michael) in den Kommentaren).quelle
Formatter
und deren Verwendung für a angebenStreamHandler
. Es ist jedoch keine Logger-Unterklasse erforderlich. Tatsächlich fügt die Verwendung einer Logger-Klasse jedem erstellten Logger einen Handler hinzu, was normalerweise nicht der Fall ist.ColoredFormatter
. Es ändert das Datensatzobjekt, das weiter an andere Handler übergeben oder an andere Protokollierer weitergegeben wird. Wenn Sie Dateiprotokollierer usw. konfiguriert haben, möchten Sie wahrscheinlich nicht, dass die Farben in den Protokolldateien enthalten sind. Um dies zu vermeiden, ist es wahrscheinlich am besten, einfach eine Kopie vonrecord
mit zu erstellen,copy.copy()
bevor Sie das Attribut levelname bearbeiten, oder den Ebenennamen auf den vorherigen Wert zurückzusetzen, bevor Sie die formatierte Zeichenfolge zurückgeben.Vor Jahren habe ich einen farbigen Stream-Handler für meinen eigenen Gebrauch geschrieben. Dann bin ich auf diese Seite gestoßen und habe eine Sammlung von Codefragmenten gefunden, die kopiert / eingefügt werden :-(. Mein Stream-Handler funktioniert derzeit nur unter UNIX (Linux, Mac OS X), aber der Vorteil ist, dass er auf PyPI (und GitHub) verfügbar ist ) und es ist kinderleicht zu bedienen. Es hat auch einen Vim-Syntaxmodus :-). In Zukunft könnte ich es auf Windows erweitern.
So installieren Sie das Paket:
Um zu bestätigen, dass es funktioniert:
So beginnen Sie mit Ihrem eigenen Code:
Das im obigen Beispiel gezeigte Standardprotokollformat enthält Datum, Uhrzeit, Hostname, den Namen des Protokollierers, die PID, die Protokollstufe und die Protokollnachricht. So sieht es in der Praxis aus:
HINWEIS: Bei Verwendung von Git Bash mit MinTTY
Git Bash unter Windows hat einige dokumentierte Macken: Winpty und Git Bash
Für ANSI-Escape-Codes und für das Umschreiben und Animieren von Zeichen im ncurses-Stil müssen Sie Befehlen ein Präfix voranstellen
winpty
.quelle
AttributeError: 'module' object has no attribute 'install'
wenn ich benutzecoloredlogs.install()
. Können Sie das mit der neuesten Version bestätigen?logging.basicConfig()
undcoloredlogs.install()
installieren Sie einen Stream-Handler, der sich an der Konsole anmeldet, sodass Sie ohne "Stornieren" doppelte Nachrichten erhalten würden ...coloredlogs.install
das zu verwendende Format wie imcolorlog
Paket zu bestimmen.Hier ist eine Lösung, die auf jeder Plattform funktionieren sollte. Wenn es mir nicht nur sagt und ich es aktualisieren werde.
So funktioniert es: Auf Plattformen, die ANSI-Escape-Zeichen unterstützen, werden diese verwendet (nicht unter Windows), und unter Windows werden API-Aufrufe verwendet, um die Konsolenfarben zu ändern.
Das Skript hackt die Methode logging.StreamHandler.emit aus der Standardbibliothek und fügt ihr einen Wrapper hinzu.
TestColorer.py
Colorer.py
quelle
args[1].msg = color + str(args[1].msg) + '\x1b[0m' # normal
.TestColorer.py
geht mich etwas an .Update : Weil dies ein Juckreiz ist, den ich schon so lange kratzen wollte, habe ich eine Bibliothek für faule Leute wie mich geschrieben, die nur einfache Möglichkeiten haben wollen, Dinge zu tun: Zenlog
Colorlog ist dafür hervorragend geeignet. Es ist auf PyPI verfügbar (und somit über installierbar
pip install colorlog
) und wird aktiv gewartet .Hier ist ein schneller Ausschnitt zum Kopieren und Einfügen, mit dem Sie die Protokollierung einrichten und anständig aussehende Protokollnachrichten drucken können:
Ausgabe:
quelle
setLevel
wirklich erforderlich?)Schnelle und schmutzige Lösung für vordefinierte Protokollebenen und ohne Definition einer neuen Klasse.
quelle
logging.basicConfig(format='%(asctime)s [%(name)s] [%(levelname)s] %(message)s')
Wo natürlich das%(levelnames)s
wichtig ist.echo -e "Normal texst \033[1;31mred bold text\033[0m normal text again"
. Die Echo--e
Option interpretiert "\ 033" als oktale Form des Escape ASCII-Symbols. Durch dieses spezielle Symbol interpretieren einige kompatible Terminals nachfolgende Zeichen (m
einschließlich Zeichen ) als Sonderbefehle. en.wikipedia.org/wiki/ANSI_escape_codeif sys.sdterr.isatty():
. In diesem Fall enthält die Datei diese Escape-Zeichen nicht, wenn Sie die Ausgabe in eine Datei umleiten.2020 Code, keine zusätzlichen Pakete erforderlich, Python 3
Definieren Sie eine Klasse
Logger instanziieren
Und verwenden!
Ergebnis
Das Vollfarbschema
Für Windows
Diese Lösung funktioniert unter Mac OS und IDE-Terminals. Die Eingabeaufforderung des Fensters hat standardmäßig überhaupt keine Farben. Hier finden Sie Anweisungen zum Aktivieren, die ich nicht ausprobiert habe. Https://www.howtogeek.com/322432/how-to-customize-your-command-prompts-color-scheme-with-microsofts-colortool/
quelle
←[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
Nun, ich denke, ich könnte genauso gut meine Variation des farbigen Loggers hinzufügen.
Dies ist nichts Besonderes, aber es ist sehr einfach zu verwenden und ändert das Datensatzobjekt nicht. Dadurch wird vermieden, dass die ANSI-Escape-Sequenzen in einer Protokolldatei protokolliert werden, wenn ein Datei-Handler verwendet wird. Die Formatierung der Protokollnachrichten wird nicht beeinflusst.
Wenn Sie bereits den Formatter des Protokollierungsmoduls verwenden , müssen Sie lediglich den Formatter Ihres Counsel-Handlers durch den ColoredFormatter ersetzen, um farbige Ebenennamen zu erhalten. Wenn Sie eine gesamte App protokollieren, müssen Sie dies nur für den Logger der obersten Ebene tun.
coloured_log.py
Anwendungsbeispiel
app.py.
sub_module.py
Ergebnisse
Terminalausgang
app.log Inhalt
Natürlich können Sie mit der Formatierung der Terminal- und Protokolldateiausgaben so ausgefallen werden, wie Sie möchten. Nur die Protokollstufe wird eingefärbt.
Ich hoffe, jemand findet das nützlich und es ist nicht einfach viel mehr dasselbe. :) :)
Die Python-Beispieldateien können von diesem GitHub-Gist heruntergeladen werden: https://gist.github.com/KurtJacobson/48e750701acec40c7161b5a2f79e6bfd
quelle
return
:colored_record.msg = ('{0}{1}m{2}{3}').format(self.PREFIX, seq, colored_record.getMessage(), self.SUFFIX)
Ich habe das Beispiel von airmind aktualisiert, das Tags für Vordergrund und Hintergrund unterstützt. Verwenden Sie einfach die Farbvariablen $ BLACK - $ WHITE in Ihrer Protokollformatiererzeichenfolge. Um den Hintergrund einzustellen, verwenden Sie einfach $ BG-BLACK - $ BG-WHITE.
Jetzt können Sie in Ihrer Konfigurationsdatei einfach Folgendes tun:
quelle
super
nur für einige alte Python-Versionen, denke ich? Da diese Antwort aus dem Jahr 2010 stammt, hat es für mich mit Python 2.7Sie können das Colorlog- Modul importieren und
ColoredFormatter
zum Kolorieren von Protokollnachrichten verwenden.Beispiel
Boilerplate für Hauptmodul:
Der Code aktiviert Farben nur in Protokollnachrichten, wenn das Colorlog-Modul installiert ist und die Ausgabe tatsächlich an ein Terminal geht. Dadurch wird vermieden, dass Escape-Sequenzen in eine Datei geschrieben werden, wenn die Protokollausgabe umgeleitet wird.
Außerdem wird ein benutzerdefiniertes Farbschema eingerichtet, das sich besser für Terminals mit dunklem Hintergrund eignet.
Einige Beispiele für die Protokollierung von Anrufen:
Ausgabe:
quelle
colorlog.basicConfig
anstattlogging.basicConfig
einige guteSchauen Sie sich die folgende Lösung an. Der Stream-Handler sollte das Färben übernehmen, dann haben Sie die Möglichkeit, Wörter und nicht nur die gesamte Zeile (mit dem Formatierer) zu färben.
http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html
quelle
Ich habe das ursprüngliche Beispiel von Sorin geändert und StreamHandler in einen ColorizedConsoleHandler unterteilt.
Der Nachteil ihrer Lösung besteht darin, dass die Nachricht geändert wird. Da dadurch die tatsächliche Protokollnachricht geändert wird, erhalten auch alle anderen Handler die geänderte Nachricht.
Dies führte in unserem Fall zu Protokolldateien mit Farbcodes, da wir mehrere Protokollierer verwenden.
Die folgende Klasse funktioniert nur auf Plattformen, die Ansi unterstützen. Es sollte jedoch trivial sein, die Windows-Farbcodes hinzuzufügen.
quelle
Jetzt gibt es ein veröffentlichtes PyPi-Modul für anpassbare farbige Protokollierungsausgaben:
https://pypi.python.org/pypi/rainbow_logging_handler/
und
https://github.com/laysakura/rainbow_logging_handler
Unterstützt Windows
Unterstützt Django
Anpassbare Farben
Da dies als Python-Ei verteilt ist, ist es für jede Python-Anwendung sehr einfach zu installieren.
quelle
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:
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:
quelle
Ein weiterer kleiner Remix von Airminds Ansatz, der alles in einer Klasse hält:
Um den Formatierer an einen Handler anzuhängen, gehen Sie wie folgt vor:
quelle
Ein einfaches, aber sehr flexibles Werkzeug zum Färben von JEDEM Terminaltext ist ' colout '.
Wenn Text in der Ausgabe von 'myprocess', der mit Gruppe 1 des regulären Ausdrucks übereinstimmt, mit Farbe1, Gruppe 2 mit Farbe2 usw. gefärbt wird.
Zum Beispiel:
Das heißt, die erste Regex-Gruppe (Parens) stimmt mit dem Anfangsdatum in der Protokolldatei überein, die zweite Gruppe entspricht einem Python-Dateinamen, einer Zeilennummer und einem Funktionsnamen und die dritte Gruppe entspricht der Protokollnachricht, die danach kommt. Ich verwende auch eine parallele Folge von 'Fett / Normal' sowie die Folge von Farben. Das sieht so aus:
Beachten Sie, dass Zeilen oder Teile von Zeilen, die keinem meiner regulären Ausdrücke entsprechen, immer noch wiedergegeben werden. Dies ist also nicht wie 'grep --color' - nichts wird aus der Ausgabe herausgefiltert.
Offensichtlich ist dies flexibel genug, dass Sie es mit jedem Prozess verwenden können, nicht nur mit dem Tailing von Protokolldateien. Normalerweise zaubere ich jedes Mal, wenn ich etwas einfärben möchte, spontan einen neuen regulären Ausdruck. Aus diesem Grund bevorzuge ich Colout gegenüber jedem benutzerdefinierten Tool zum Ausmalen von Protokolldateien, da ich nur ein Tool lernen muss, unabhängig davon, was ich einfärbe: Protokollierung, Testausgabe, Syntax, die Codeausschnitte im Terminal hervorhebt usw.
Es wird auch vermieden, ANSI-Codes tatsächlich in die Protokolldatei selbst zu kopieren, was meiner Meinung nach eine schlechte Idee ist, da dadurch beispielsweise das Suchen nach Mustern in der Protokolldatei unterbrochen wird, es sei denn, Sie denken immer daran, die ANSI-Codes in Ihrer Grep-Regex abzugleichen.
quelle
quelle
[9*m
Codes für die "hellen" ANSI-Farben! PS Ihre letzte Zeile betrifft mich ein wenig, da noch nicht bekannt ist, ob die Protokollierung außerhalb einer Funktionsdefinition in Python sicher ist .Hier ist meine Lösung:
quelle
Ich hatte Probleme damit, den Formatierer richtig einzurichten:
Und dann zu verwenden:
quelle
Während die anderen Lösungen in Ordnung zu sein scheinen, haben sie einige Probleme. Einige färben die gesamten Linien, was manchmal nicht erwünscht ist, und andere lassen jede Konfiguration aus, die Sie möglicherweise alle zusammen haben. Die folgende Lösung wirkt sich nur auf die Nachricht selbst aus.
Code
Beispiel
Ausgabe
Wie Sie sehen, wird alles andere immer noch ausgegeben und bleibt in der ursprünglichen Farbe. Wenn Sie etwas anderes als die Nachricht ändern möchten, können Sie einfach die Farbcodes
log_format
im Beispiel übergeben.quelle
[17:01:36]:WARNING:this should be yellowthis should be yellow
oder eine ganze Zeile, die zweimal gedruckt wird?7s:%(message)s
aus dem zu entfernenlog_format
.Ich muss zwei Einreichungen hinzufügen, von denen eine nur die Nachricht einfärbt (ColoredFormatter) und eine die gesamte Zeile einfärbt (ColorizingStreamHandler). Dazu gehören auch mehr ANSI-Farbcodes als bei früheren Lösungen.
Einige Inhalte stammen (mit Änderungen) aus: dem obigen Beitrag und http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html .
Färbt nur die Nachricht ein:
Färbt die ganze Linie ein:
quelle
Habe gerade das gleiche auf ähnliche Frage beantwortet: Python | Ändern Sie die Textfarbe in der Shell
Die Idee ist, die Clint- Bibliothek zu verwenden. Welches unterstützt MAC, Linux und Windows Shells (CLI).
quelle
Dies ist eine Aufzählung mit den Farbcodes:
Dies kann auf die Namen der einzelnen Protokollebenen angewendet werden. Seien Sie sich bewusst, dass dies ein monströser Hack ist.
Beachten Sie, dass Ihr Protokollformatierer den Namen der Protokollebene enthalten muss
zum Beispiel:
quelle
FriendlyLog ist eine weitere Alternative. Es funktioniert mit Python 2 & 3 unter Linux, Windows und MacOS.
quelle
Was ist mit dem Hervorheben von Protokollnachrichtenargumenten mit abwechselnden Farben zusätzlich zum Färben nach Ebene? Ich habe kürzlich einfachen Code dafür geschrieben. Ein weiterer Vorteil besteht darin, dass der Protokollaufruf mit der Formatierung im Python 3-Klammerstil erfolgt. (
"{}"
).Den neuesten Code und Beispiele finden Sie hier: https://github.com/davidohana/colargulog
Beispielprotokollierungscode:
Ausgabe:
Implementierung:
quelle
Verwenden Sie Pyfancy .
Beispiel:
quelle
logging
Funktionalität zu optimieren , um eine separate Farbbibliothek zu verwenden.Nur eine weitere Lösung mit den Farben von ZetaSyanthis:
Rufen Sie es einmal von Ihrer
__main__
Funktion aus. Ich habe so etwas dort:Außerdem wird überprüft, ob es sich bei der Ausgabe um eine Konsole handelt. Andernfalls werden keine Farben verwendet.
quelle
Verwendungszweck
Logger("File Name").info("This shows green text")
quelle
Die folgende Lösung funktioniert nur mit Python 3, aber für mich sieht es am klarsten aus.
Die Idee ist, mithilfe der Protokolldatensatzfabrik 'farbige' Attribute zu Protokolldatensatzobjekten hinzuzufügen und diese 'farbigen' Attribute dann im Protokollformat zu verwenden.
Sie können dieses Beispiel leicht ändern, um andere farbige Attribute (z. B. message_c) zu erstellen, und diese Attribute dann verwenden, um farbigen Text (nur) dort abzurufen, wo Sie möchten.
(Praktischer Trick, den ich kürzlich entdeckt habe: Ich habe eine Datei mit farbigen Debug-Protokollen und wann immer ich die Protokollstufe meiner Anwendung vorübergehend erhöhen möchte, habe ich nur
tail -f
die Protokolldatei in einem anderen Terminal und sehe Debug-Protokolle auf dem Bildschirm, ohne die Konfiguration zu ändern und die Anwendung neu zu starten )quelle
Dies ist eine weitere Python3-Variante des Beispiels von airmind. Ich wollte einige spezifische Funktionen, die ich in den anderen Beispielen nicht gesehen habe
Anmerkungen: Ich habe colorama verwendet, aber Sie können dies ändern, sodass es nicht erforderlich ist. Auch für meine Tests habe ich nur eine Python-Datei ausgeführt, sodass sich meine Klasse im Modul befindet.
__main__
Sie müssten zu dem wechseln(): __main__.ColoredFormatter
, was auch immer Ihr Modul ist.logging.yaml
main.py.
Ausgabe:
quelle