Jakiś czas temu widziałem aplikację Mono z kolorowym wyjściem, prawdopodobnie ze względu na jej system logów (ponieważ wszystkie wiadomości były znormalizowane).
Teraz Python ma logging
moduł, który pozwala określić wiele opcji dostosowywania danych wyjściowych. Więc wyobrażam sobie, że coś podobnego byłoby możliwe w Pythonie, ale nigdzie nie mogę się dowiedzieć, jak to zrobić.
Czy jest jakiś sposób, aby logging
moduł Pythona wyświetlał w kolorze?
Czego chcę (na przykład) błędy na czerwono, komunikaty debugowania na niebiesko lub żółto i tak dalej.
Oczywiście wymagałoby to prawdopodobnie zgodnego terminala (większość współczesnych terminali); ale mógłbym wrócić do oryginalnego logging
wyjścia, jeśli kolor nie jest obsługiwany.
Jakieś pomysły, jak uzyskać kolorowe wydruki za pomocą modułu logowania?
Odpowiedzi:
Wiedziałem już o ucieczkach kolorów, użyłem ich w zachęcie do bashu jakiś czas temu. W każdym razie dzięki.
Chciałem zintegrować go z modułem rejestrowania, co ostatecznie zrobiłem po kilku próbach i błędach.
Oto co kończę z:
Aby z niego skorzystać, stwórz własny Logger:
Na wypadek, gdyby ktoś tego potrzebował.
Uważaj, jeśli używasz więcej niż jednego programu rejestrującego lub procedury obsługi:
ColoredFormatter
zmienia obiekt rekordu, który jest przekazywany dalej do innych programów obsługi lub propagowany do innych programów rejestrujących. Jeśli skonfigurowałeś rejestratory plików itp., Prawdopodobnie nie chcesz mieć kolorów w plikach dziennika. Aby tego uniknąć, prawdopodobnie najlepiej po prostu utworzyć kopięrecord
zcopy.copy()
przed modyfikacją atrybutu levelname lub zresetować levelname do poprzedniej wartości, przed zwróceniem sformatowanego ciągu (podziękowania dla Michaela w komentarzach).źródło
Formatter
i określenie jej zastosowania naStreamHandler
. Ale nie ma potrzeby tworzenia podklasy rejestratora. W rzeczywistości użycie klasy logger dodaje moduł obsługi do każdego utworzonego loggera, co nie jest tym, czego zwykle chcesz.ColoredFormatter
. Zmienia obiekt rekordu, który jest przekazywany dalej do innych programów obsługi lub propagowany do innych programów rejestrujących. Jeśli skonfigurowałeś rejestratory plików itp., Prawdopodobnie nie chcesz mieć kolorów w plikach dziennika. Aby tego uniknąć, prawdopodobnie najlepiej jest po prostu utworzyć kopięrecord
zcopy.copy()
przed manipulowaniem atrybutem levelname lub zresetować levelname do poprzedniej wartości przed zwróceniem sformatowanego ciągu.Wiele lat temu napisałem kolorowy moduł obsługi strumienia na własny użytek. Potem natknąłem się na tę stronę i znalazłem kolekcję fragmentów kodu, które ludzie kopiują / wklejają :-(. Mój moduł obsługi strumienia działa obecnie tylko w systemie UNIX (Linux, Mac OS X), ale zaletą jest to, że jest dostępny w PyPI (i GitHub ) i jest bardzo prosty w użyciu. Posiada również tryb składni Vima :-). W przyszłości mogę rozszerzyć go na system Windows.
Aby zainstalować pakiet:
Aby potwierdzić, że działa:
Aby rozpocząć z własnym kodem:
Domyślny format dziennika pokazany w powyższym przykładzie zawiera datę, godzinę, nazwę hosta, nazwę rejestratora, PID, poziom dziennika i komunikat dziennika. Tak to wygląda w praktyce:
UWAGA: Podczas korzystania z Git Bash w / MinTTY
Git Bash w Windows ma kilka udokumentowanych dziwactw: Winpty i Git Bash
Które w przypadku kodów ucieczkowych ANSI oraz przepisywania znaków i animacji przez ncurses należy poprzedzać poleceniami
winpty
.źródło
AttributeError: 'module' object has no attribute 'install'
podczas używaniacoloredlogs.install()
. Czy możesz to potwierdzić za pomocą najnowszej wersji.logging.basicConfig()
icoloredlogs.install()
zainstalować obsługi strumienia, który loguje do konsoli, więc bez „unieważnienie”, co można uzyskać duplikaty wiadomości ...coloredlogs.install
którego formatu użyć, jak wcolorlog
pakiecie.Oto rozwiązanie, które powinno działać na dowolnej platformie. Jeśli to nie tylko mi powie, a ja go zaktualizuję.
Jak to działa: na platformie obsługującej ucieczki ANSI używa ich (nie Windows), a na Windows używa wywołań API do zmiany kolorów konsoli.
Skrypt włamuje się do metody logging.StreamHandler.emit ze standardowej biblioteki, dodając do niej opakowanie.
TestColorer.py
Colorer.py
źródło
args[1].msg = color + str(args[1].msg) + '\x1b[0m' # normal
.TestColorer.py
mnie to niepokoi.Aktualizacja : Ponieważ to jest świąd, który od dawna chciałem podrapać, napisałem bibliotekę dla leniwych ludzi takich jak ja, którzy chcą tylko prostych sposobów: zenlog
Colorlog jest do tego doskonały. Jest dostępny na PyPI (a zatem można go zainstalować
pip install colorlog
) i jest aktywnie utrzymywany .Oto krótki fragment, który można skopiować i wkleić, aby skonfigurować rejestrowanie i wydrukować przyzwoicie wyglądające komunikaty dziennika:
Wynik:
źródło
setLevel
naprawdę potrzebne?)Szybkie i brudne rozwiązanie dla predefiniowanych poziomów dziennika i bez definiowania nowej klasy.
źródło
logging.basicConfig(format='%(asctime)s [%(name)s] [%(levelname)s] %(message)s')
takiego : gdzie oczywiście%(levelnames)s
jest to ważne.echo -e "Normal texst \033[1;31mred bold text\033[0m normal text again"
.-e
opcja echo interpretuje „\ 033” jako ósemkową formę znaku Escape ASCII. Ten specjalny symbol powoduje, że niektóre kompatybilne terminale interpretują kolejne znaki (do znakowaniam
włącznie) jako polecenia specjalne. en.wikipedia.org/wiki/ANSI_escape_codeif sys.sdterr.isatty():
. W takim przypadku, jeśli przekierujesz dane wyjściowe do pliku, plik nie będzie zawierał tych znaków zmiany znaczenia.Kod 2020, dodatkowe pakiety nie są wymagane, Python 3
Zdefiniuj klasę
Utwórz instancję rejestratora
I użyć!
Wynik
Pełna kolorystyka
Dla Windowsa
To rozwiązanie działa na Mac OS, terminalach IDE. Wygląda na to, że wiersz polecenia okna nie ma w ogóle kolorów. Oto instrukcje, jak je włączyć, których nie próbowałem https://www.howtogeek.com/322432/how-to-customize-your-command-prompts-color-scheme-with-microsofts-colortool/
źródło
←[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
Wydaje mi się, że równie dobrze mogę dodać moją odmianę kolorowego rejestratora.
Nie jest to nic szczególnego, ale jest bardzo prosty w użyciu i nie zmienia obiektu rekordu, dzięki czemu unika się rejestrowania sekwencji specjalnych ANSI w pliku dziennika, jeśli używana jest procedura obsługi pliku. Nie wpływa na formatowanie komunikatu dziennika.
Jeśli już korzystasz z modułu formatującego modułu rejestrowania , wszystko, co musisz zrobić, aby uzyskać nazwy poziomów kolorowych, to zastąpić program obsługi formaterów modułem rejestrującym za pomocą narzędzia ColorFormatter. Jeśli logujesz całą aplikację, musisz to zrobić tylko dla rejestratora najwyższego poziomu.
colored_log.py
Przykładowe użycie
app.py
sub_module.py
Wyniki
Wyjście terminala
zawartość app.log
Oczywiście możesz uzyskać tyle fantazji, ile chcesz, formatując dane wyjściowe terminala i pliku dziennika. Tylko poziom dziennika zostanie pokolorowany.
Mam nadzieję, że ktoś uzna to za przydatne i nie jest to po prostu zbyt wiele tego samego. :)
Przykładowe pliki Pythona można pobrać z tej GitHub Gist: https://gist.github.com/KurtJacobson/48e750701acec40c7161b5a2f79e6bfd
źródło
return
:colored_record.msg = ('{0}{1}m{2}{3}').format(self.PREFIX, seq, colored_record.getMessage(), self.SUFFIX)
Zaktualizowałem przykład z tagów obsługujących Airmind dla pierwszego planu i tła. Wystarczy użyć zmiennych kolorów $ BLACK - $ WHITE w ciągu formatyzatora dziennika. Aby ustawić tło, użyj $ BG-BLACK - $ BG-WHITE.
Teraz możesz w prosty sposób wykonać następujące czynności w pliku konfiguracyjnym:
źródło
super
przypuszczam, że komentarz dotyczy tylko niektórych starożytnych wersji Pythona? Ponieważ ta odpowiedź pochodzi z 2010 roku. Działa dobrze dla mnie z Python 2.7Możesz zaimportować moduł colorlog i użyć go
ColoredFormatter
do pokolorowania komunikatów dziennika.Przykład
Płyta kotła dla modułu głównego:
Kod włącza kolory w komunikatach dziennika tylko wtedy, gdy moduł colorlog jest zainstalowany i jeśli dane wyjściowe faktycznie trafiają do terminala. Pozwala to uniknąć zapisywania sekwencji specjalnych w pliku, gdy dane wyjściowe dziennika są przekierowywane.
Ponadto konfiguracja kolorów niestandardowych jest lepiej dostosowana do terminali z ciemnym tłem.
Niektóre przykładowe rejestrowanie połączeń:
Wynik:
źródło
colorlog.basicConfig
zamiast tego,logging.basicConfig
który ma pewne dobre ustawienia domyślneSpójrz na następujące rozwiązanie. Obsługa strumienia powinna zajmować się kolorowaniem, wtedy masz opcję kolorowania słów, a nie całej linii (za pomocą Formatyzatora).
http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html
źródło
Zmodyfikowałem oryginalny przykład dostarczony przez Sorina i podklasowałem StreamHandler do ColorizedConsoleHandler.
Minusem ich rozwiązania jest to, że modyfikuje komunikat, a ponieważ to modyfikuje rzeczywisty komunikat, każdy inny moduł obsługi otrzyma również zmodyfikowany komunikat.
W naszym przypadku powstały pliki dziennika z kodami kolorów, ponieważ korzystamy z wielu rejestratorów.
Poniższa klasa działa tylko na platformach obsługujących ansi, ale dodawanie do niej kodów kolorów systemu Windows powinno być trywialne.
źródło
Teraz dostępny jest moduł PyPi do dostosowywania kolorowych wyników rejestrowania:
https://pypi.python.org/pypi/rainbow_logging_handler/
i
https://github.com/laysakura/rainbow_logging_handler
Obsługuje system Windows
Obsługuje Django
Możliwość dostosowania kolorów
Ponieważ jest on dystrybuowany jako jajko Pythona, jest bardzo łatwy w instalacji dla dowolnej aplikacji Python.
źródło
Istnieje mnóstwo odpowiedzi. Ale nikt nie mówi o dekoratorach. Więc tu jest moje.
Ponieważ jest to o wiele prostsze.
Nie trzeba niczego importować ani pisać żadnej podklasy:
Ustawia to błędy na czerwono, komunikaty debugowania na niebiesko i tak dalej. Jak zadane w pytaniu.
Możemy nawet dostosować opakowanie, aby wziąć
color
argument, aby dynamicznie ustawić kolor wiadomości za pomocąlogger.debug("message", color=GREY)
EDYCJA: Oto dostosowany dekorator do ustawiania kolorów w czasie wykonywania:
źródło
Kolejny drobny remiks podejścia airminda, który utrzymuje wszystko w jednej klasie:
Aby użyć dołączyć formater do modułu obsługi, coś takiego:
źródło
Prostym, ale bardzo elastycznym narzędziem do kolorowania DOWOLNEGO tekstu terminala jest „ colout ”.
Gdzie dowolny tekst na wyjściu „myprocess”, który pasuje do grupy 1 wyrażenia regularnego, będzie pokolorowany kolorem 1, grupa 2 kolorem 2 itd.
Na przykład:
tzn. pierwsza grupa wyrażeń regularnych (parens) odpowiada początkowej dacie w pliku dziennika, druga grupa odpowiada nazwie pliku python, numerowi wiersza i nazwie funkcji, a trzecia grupa odpowiada późniejszemu komunikatowi dziennika. Używam również równoległej sekwencji „pogrubienia / normalnych”, a także sekwencji kolorów. To wygląda jak:
Zauważ, że linie lub części linii, które nie pasują do żadnego z moich wyrażeń regularnych, są nadal powtarzane, więc to nie jest jak „grep - kolor” - nic nie jest odfiltrowywane z wyniku.
Oczywiście jest to na tyle elastyczne, że można go używać z dowolnym procesem, nie tylko dostosowywaniem plików dziennika. Zazwyczaj robię nowe wyrażenie regularne w locie za każdym razem, gdy chcę coś pokolorować. Z tego powodu wolę narzędzie colout niż dowolne niestandardowe narzędzie do kolorowania plików dziennika, ponieważ muszę nauczyć się tylko jednego narzędzia, niezależnie od tego, co koloruję: rejestrowanie, testowanie danych wyjściowych, podświetlanie składni fragmentów kodu w terminalu itp.
Unika także faktycznego zrzucania kodów ANSI do samego pliku dziennika, co IMHO jest złym pomysłem, ponieważ spowoduje to przerwanie takich rzeczy, jak szukanie wzorców w pliku dziennika, chyba że zawsze pamiętasz, aby dopasować kody ANSI w wyrażeniu regularnym grep.
źródło
źródło
[9*m
kodami dla „jasnych” kolorów ANSI! PS twoja ostatnia linia trochę mnie niepokoi, ponieważ nie wiadomo jeszcze, czy logowanie poza definicją funkcji jest bezpieczne w Pythonie .Oto moje rozwiązanie:
źródło
Problemem było prawidłowe ustawienie formatyzatora:
A następnie użyć:
źródło
Podczas gdy inne rozwiązania wydają się w porządku, mają pewne problemy. Niektóre kolorują całe linie, które czasami nie są pożądane, a niektóre pomijają konfigurację, którą możesz mieć razem. Poniższe rozwiązanie nie wpływa na nic oprócz samej wiadomości.
Kod
Przykład
Wynik
Jak widać, wszystko inne nadal jest generowane i pozostaje w pierwotnym kolorze. Jeśli chcesz zmienić cokolwiek innego niż wiadomość, możesz po prostu przekazać kody kolorów
log_format
w przykładzie.źródło
[17:01:36]:WARNING:this should be yellowthis should be yellow
lub dwukrotne wydrukowanie pełnej linii?7s:%(message)s
zlog_format
.Mam dwa zgłoszenia do dodania, z których jeden koloruje tylko komunikat (ColoredFormatter), a drugi koloruje całą linię (ColorizingStreamHandler). Obejmują one również więcej kodów kolorów ANSI niż poprzednie rozwiązania.
Niektóre treści zostały pozyskane (z modyfikacjami) z: powyższego postu oraz http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html .
Koloruje tylko wiadomość:
Koloruje całą linię:
źródło
Właśnie odpowiedziałem na to samo na podobne pytanie: Python | zmień kolor tekstu w powłoce
Chodzi o to, aby użyć biblioteki clint . Który ma wsparcie dla powłok MAC, Linux i Windows (CLI).
źródło
To jest Enum zawierające kody kolorów:
Można to zastosować do nazw każdego poziomu dziennika. Pamiętaj, że jest to potworny hack.
Zauważ, że twój formatyzator dziennika musi zawierać nazwę poziomu dziennika
na przykład:
źródło
FriendlyLog to kolejna alternatywa. Działa z Python 2 i 3 w systemach Linux, Windows i MacOS.
źródło
Co powiesz na wyróżnianie również logów wiadomości z naprzemiennymi kolorami, oprócz kolorowania według poziomu? Ostatnio napisałem do tego prosty kod. Kolejną zaletą jest to, że wywołanie dziennika jest wykonywane przy użyciu formatu nawiasów klamrowych w języku Python 3. (
"{}"
).Zobacz najnowszy kod i przykłady tutaj: https://github.com/davidohana/colargulog
Przykładowy kod rejestracyjny:
Wynik:
Realizacja:
źródło
Użyj pyfancy .
Przykład:
źródło
logging
funkcjonalności w celu użycia oddzielnej biblioteki kolorów.Kolejne rozwiązanie z kolorami ZetaSyanthis:
nazwij to raz ze swojej
__main__
funkcji. Mam tam coś takiego:sprawdza również, czy dane wyjściowe są konsolą, w przeciwnym razie nie zostaną użyte żadne kolory.
źródło
Stosowanie
Logger("File Name").info("This shows green text")
źródło
Poniższe rozwiązanie działa tylko z Pythonem 3, ale dla mnie wygląda to najwyraźniej.
Chodzi o to, aby użyć fabryki rekordów dziennika, aby dodać atrybuty „kolorowe” do obiektów rekordu dziennika, a następnie użyć tych atrybutów „kolorowych” w formacie dziennika.
Możesz łatwo zmodyfikować ten przykład, aby utworzyć inne kolorowe atrybuty (np. Message_c), a następnie użyć tych atrybutów, aby uzyskać kolorowy tekst (tylko) tam, gdzie chcesz.
(przydatna sztuczka, którą niedawno odkryłem: mam plik z kolorowymi dziennikami debugowania i kiedykolwiek chcę tymczasowo zwiększyć poziom dziennika mojej aplikacji, po prostu
tail -f
plik dziennika w innym terminalu i widzę dzienniki debugowania na ekranie bez zmiany konfiguracji i ponownego uruchamiania aplikacji )źródło
To kolejny wariant przykładu airminda w Pythonie. Chciałem pewnych konkretnych funkcji, których nie widziałem w innych przykładach
Uwagi: Użyłem colorama, ale można to zmodyfikować, aby nie było wymagane. Również dla moich testów właśnie uruchomiłem plik Pythona, więc moja klasa jest w module.
__main__
Musisz zmienić(): __main__.ColoredFormatter
na dowolny moduł.logowanie.jaml
main.py
wynik:
źródło