Некоторое время назад я видел приложение Mono с цветным выводом, вероятно, из-за его системы журналов (потому что все сообщения были стандартизированы).
Теперь в Python есть logging
модуль, который позволяет вам указать множество параметров для настройки вывода. Итак, я представляю, что подобное возможно с Python, но я не могу найти, как это сделать где-либо.
Есть ли способ сделать logging
вывод модуля Python в цвете?
Что я хочу (например) ошибки в красном, отладочные сообщения в синем или желтом, и так далее.
Конечно, для этого, вероятно, потребуется совместимый терминал (большинство современных терминалов); но я мог бы вернуться к исходному logging
выводу, если цвет не поддерживается.
Любые идеи, как я могу получить цветной вывод с модулем регистрации?
Ответы:
Я уже знал о побегах цветов, я использовал их в моем приглашении bash некоторое время назад. Спасибо, в любом случае.
Я хотел интегрировать его с модулем регистрации, что я и сделал после нескольких попыток и ошибок.
Вот что я получаю в итоге:
И чтобы использовать его, создайте свой собственный Logger:
На всякий случай кому-то еще это нужно.
Будьте осторожны, если вы используете более одного регистратора или обработчика:
ColoredFormatter
изменяет объект записи, который передается другим обработчикам или распространяется другим регистраторам. Если вы настроили регистраторы файлов и т. Д., Вы, вероятно, не хотите иметь цвета в файлах журналов. Чтобы избежать этого, вероятно, лучше просто создать копиюrecord
сcopy.copy()
перед тем, как манипулировать атрибутом namename, или сбросить имя уровня на предыдущее значение, прежде чем возвращать отформатированную строку Майклу в комментариях).источник
Formatter
и определите его использование для aStreamHandler
. Но нет необходимости в подклассе регистратора. Фактически использование класса logger добавляет обработчик для каждого созданного logger, что обычно не то, что вы хотите.ColoredFormatter
. Это изменяет объект записи, который передается другим обработчикам или распространяется другим регистраторам. Если вы настроили регистраторы файлов и т. Д., Вы, вероятно, не хотите иметь цвета в файлах журналов. Чтобы избежать этого, вероятно, лучше всего просто создать копиюrecord
сcopy.copy()
перед тем, как манипулировать атрибутом имени уровня, или сбросить имя уровня до предыдущего значения перед возвратом отформатированной строки.Несколько лет назад я написал обработчик цветного потока для собственного использования. Затем я наткнулся на эту страницу и обнаружил коллекцию фрагментов кода, которые люди копируют / вставляют :-(. Мой обработчик потока в настоящее время работает только в UNIX (Linux, Mac OS X), но преимущество в том, что он доступен в PyPI (и GitHub). ) и он очень прост в использовании. Он также имеет режим синтаксиса Vim :-). В будущем я мог бы расширить его для работы на Windows.
Чтобы установить пакет:
Чтобы подтвердить, что это работает:
Чтобы начать работу с собственным кодом:
Формат журнала по умолчанию, показанный в приведенном выше примере, содержит дату, время, имя хоста, имя регистратора, PID, уровень журнала и сообщение журнала. Вот как это выглядит на практике:
ПРИМЕЧАНИЕ: при использовании Git Bash с MinTTY
У Git Bash в Windows есть несколько задокументированных особенностей: Winpty и Git Bash
Который для управляющих кодов ANSI, а также для переписывания символов и анимации в стиле ncurses, вы должны использовать префикс команды
winpty
.источник
AttributeError: 'module' object has no attribute 'install'
при использованииcoloredlogs.install()
. Можете ли вы подтвердить это последней версией.logging.basicConfig()
и другоеcoloredlogs.install()
установите потоковый обработчик, который регистрирует данные на консоли, поэтому без «аннулирования» вы получите дублирующиеся сообщения ...coloredlogs.install
какой формат использовать, как вcolorlog
пакете.Вот решение, которое должно работать на любой платформе. Если это не просто сказать мне, и я буду обновлять его.
Как это работает: на платформе, поддерживающей экранирование ANSI, использует их (не Windows), а в Windows использует вызовы API для изменения цветов консоли.
Скрипт взламывает метод logging.StreamHandler.emit из стандартной библиотеки, добавляя к нему оболочку.
TestColorer.py
Colorer.py
источник
args[1].msg = color + str(args[1].msg) + '\x1b[0m' # normal
.TestColorer.py
касается меня.Обновление : так как это зуд, о котором я так долго думал, я решил написать библиотеку для таких ленивых людей, как я, которые просто хотят делать простые вещи: zenlog
Colorlog отлично подходит для этого. Он доступен на PyPI (и, следовательно, устанавливается через
pip install colorlog
) и активно поддерживается .Вот быстрый фрагмент, который можно скопировать и вставить, чтобы настроить ведение журнала и распечатать прилично выглядящие сообщения журнала:
Вывод:
источник
setLevel
действительно ли нужны три вызова ?)Быстрое и грязное решение для предопределенных уровней журнала и без определения нового класса.
источник
logging.basicConfig(format='%(asctime)s [%(name)s] [%(levelname)s] %(message)s')
где, конечно,%(levelnames)s
важно.echo -e "Normal texst \033[1;31mred bold text\033[0m normal text again"
, Параметр echo-e
интерпретирует "\ 033" как восьмеричную форму символа Escape ASCII. Этот специальный символ заставляет некоторые совместимые терминалы интерпретировать последующие символы (m
включая символы ) как специальные команды. en.wikipedia.org/wiki/ANSI_escape_codeif sys.sdterr.isatty():
. В этом случае, если вы перенаправите вывод в файл, файл не будет содержать эти escape-символы.Код 2020, дополнительные пакеты не требуются, Python 3
Определить класс
Создайте логгер
И использовать!
Результат
Полная цветовая схема
Для окон
Это решение работает на Mac OS, терминалах IDE. Похоже, командная строка окна по умолчанию вообще не имеет цветов. Вот инструкции по их включению, которые я не пробовал https://www.howtogeek.com/322432/how-to-customize-your-command-prompts-color-scheme-with-microsofts-colortool/
источник
←[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
Ну, я думаю, я мог бы также добавить свой вариант цветного регистратора.
В этом нет ничего особенного, но он очень прост в использовании и не меняет объект записи, тем самым избегая записи escape-последовательностей ANSI в файл журнала, если используется обработчик файла. Это не влияет на форматирование сообщения журнала.
Если вы уже используете Formatter модуля ведения журнала , все, что вам нужно сделать, чтобы получить цветные имена уровней, это заменить ваши обработчики адвокатов Formatter на ColoredFormatter. Если вы регистрируете приложение целиком, вам нужно сделать это только для регистратора верхнего уровня.
colored_log.py
Пример использования
app.py
sub_module.py
Результаты
Терминальный выход
содержание app.log
Конечно, вы можете получить все, что захотите, с форматированием терминала и выводом файла журнала. Только уровень журнала будет раскрашен.
Я надеюсь, что кто-то найдет это полезным, и это не слишком много того же самого. :)
Файлы примеров Python можно загрузить из этого GitHub Gist: https://gist.github.com/KurtJacobson/48e750701acec40c7161b5a2f79e6bfd
источник
return
:colored_record.msg = ('{0}{1}m{2}{3}').format(self.PREFIX, seq, colored_record.getMessage(), self.SUFFIX)
Я обновил пример поддержки тегов airmind для переднего и заднего плана. Просто используйте переменные цвета $ BLACK - $ WHITE в вашей строке форматирования журнала. Чтобы установить фон, просто используйте $ BG-BLACK - $ BG-WHITE.
Теперь вы можете просто сделать следующее в вашем конфигурационном файле:
источник
super
я думаю, что комментарий относится только к какой-то древней версии Python? Так как этот ответ с 2010 года. Он отлично работал для меня с Python 2.7Вы можете импортировать модуль colorlog и использовать его
ColoredFormatter
для раскрашивания сообщений журнала.пример
Бойлер для основного модуля:
Код включает цвета только в сообщениях журнала, если установлен модуль colorlog и если выходные данные действительно передаются на терминал. Это позволяет избежать записи escape-последовательностей в файл при перенаправлении вывода журнала.
Также настраивается индивидуальная цветовая схема, которая лучше подходит для терминалов с темным фоном.
Некоторые примеры регистрации звонков:
Вывод:
источник
colorlog.basicConfig
вместоlogging.basicConfig
которых есть некоторые хорошие значения по умолчаниюПосмотрите на следующее решение. Обработчик потока должен быть тем, кто выполняет раскраску, тогда у вас есть возможность раскрасить слова, а не только всю строку (с помощью Formatter).
http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html
источник
Я изменил исходный пример, предоставленный Сорином, и подклассифицированный StreamHandler в ColorizedConsoleHandler.
Недостатком их решения является то, что оно модифицирует сообщение, и поскольку оно изменяет фактическое сообщение журнала, любые другие обработчики также получат измененное сообщение.
Это привело к лог-файлам с цветными кодами в нашем случае, потому что мы используем несколько регистраторов.
Класс ниже работает только на платформах, которые поддерживают ANSI, но добавить к нему цветовые коды Windows должно быть тривиально.
источник
Теперь есть выпущенный модуль PyPi для настраиваемого вывода цветных журналов:
https://pypi.python.org/pypi/rainbow_logging_handler/
а также
https://github.com/laysakura/rainbow_logging_handler
Поддерживает Windows
Поддерживает Джанго
Настраиваемые цвета
Поскольку это распространяется как яйцо Python, его очень легко установить для любого приложения Python.
источник
Есть тонны ответов. Но никто не говорит о декораторах. Так вот мой.
Потому что это намного проще.
Нет необходимости ни импортировать, ни писать подклассы:
Это устанавливает ошибки красным, отладочные сообщения синим и так далее. Как и в вопросе.
Мы могли бы даже адаптировать обертку, чтобы взять
color
аргумент для динамической установки цвета сообщения, используяlogger.debug("message", color=GREY)
РЕДАКТИРОВАТЬ: Итак, вот адаптированный декоратор для установки цветов во время выполнения:
источник
Еще один незначительный ремикс подхода Airmind, который держит все в одном классе:
Чтобы использовать присоединение форматера к обработчику, что-то вроде:
источник
Простой, но очень гибкий инструмент для окраски ЛЮБОГО терминального текста - « colout ».
Где любой текст в выводе «myprocess», который соответствует группе 1 регулярного выражения, будет окрашен в color1, группа 2 в color2 и т. Д.
Например:
т.е. первая группа регулярных выражений (parens) соответствует начальной дате в файле журнала, вторая группа соответствует имени файла python, номеру строки и имени функции, а третья группа соответствует сообщению журнала, которое следует после этого. Я также использую параллельную последовательность «жирный / нормальный», а также последовательность цветов. Это выглядит так:
Обратите внимание, что строки или части строк, которые не соответствуют ни одному из моих регулярных выражений, все еще отражаются, так что это не похоже на 'grep --color' - ничего не отфильтровано из вывода.
Очевидно, что это достаточно гибко, так что вы можете использовать его с любым процессом, а не только с файлами журналов. Обычно я просто запускаю новое регулярное выражение на лету, когда хочу что-то раскрасить. По этой причине я предпочитаю colout любому пользовательскому инструменту окраски лог-файлов, потому что мне нужно изучить только один инструмент, независимо от того, что я раскрашиваю: ведение журнала, тестовый вывод, подсветка синтаксиса, фрагменты кода в терминале и т. Д.
Это также позволяет избежать фактического сброса кодов ANSI в самом файле журнала, что, по-моему, является плохой идеей, поскольку оно нарушает такие вещи, как поиск шаблонов в файле журнала, если вы всегда не помните совпадение кодов ANSI в своем выражении grep.
источник
источник
[9*m
кодами для «ярких» цветов ANSI! PS Ваша последняя строка немного беспокоит меня, потому что еще не известно, безопасна ли регистрация в журнале вне определения функции в Python .Вот мое решение:
источник
У меня были проблемы с правильной настройкой форматера:
А потом использовать:
источник
Хотя другие решения кажутся хорошими, у них есть некоторые проблемы. Некоторые действительно окрашивают целые строки, которые иногда не нужны, а некоторые пропускают любую конфигурацию, которую вы могли бы иметь вместе. Решение ниже не влияет ни на что, кроме самого сообщения.
Код
пример
Вывод
Как видите, все остальное все еще выводится и остается в своем первоначальном цвете. Если вы хотите изменить что-либо кроме сообщения, вы можете просто передать цветовые коды
log_format
в примере.источник
[17:01:36]:WARNING:this should be yellowthis should be yellow
или полная строка печатается дважды?7s:%(message)s
изlog_format
.У меня есть два представления для добавления, одно из которых окрашивает только сообщение (ColoredFormatter), а другое - всю строку (ColorizingStreamHandler). Они также включают больше цветовых кодов ANSI, чем предыдущие решения.
Некоторая информация была получена (с изменениями) из: поста выше и http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html .
Раскрашивает только сообщение:
Раскрашивает всю линию:
источник
Только что ответил на аналогичный вопрос: Python | изменить цвет текста в оболочке
Идея состоит в том, чтобы использовать библиотеку clint . Который имеет поддержку оболочек MAC, Linux и Windows (CLI).
источник
Это Enum, содержащий цветовые коды:
Это может быть применено к именам каждого уровня журнала. Имейте в виду, что это чудовищный взлом.
Обратите внимание, что ваш форматер журнала должен содержать имя уровня журнала
например:
источник
FriendlyLog - это еще одна альтернатива. Он работает с Python 2 и 3 под Linux, Windows и MacOS.
источник
А как насчет выделения также регистрировать аргументы сообщения чередующимися цветами, в дополнение к раскраске по уровню? Я недавно написал простой код для этого. Другое преимущество заключается в том, что вызов журнала выполняется с использованием форматирования в скобках в стиле Python 3. (
"{}"
).Смотрите последний код и примеры здесь: https://github.com/davidohana/colargulog
Пример регистрационного кода:
Вывод:
Реализация:
источник
Используйте pyfancy .
Пример:
источник
logging
функциональность для использования отдельной библиотеки раскрасок.Просто еще одно решение, с цветами ZetaSyanthis:
позвоните один раз из вашей
__main__
функции. У меня там что-то вроде этого:он также проверяет, является ли вывод консолью, иначе цвета не используются.
источник
Применение
Logger("File Name").info("This shows green text")
источник
Следующее решение работает только с Python 3, но для меня это выглядит наиболее ясно.
Идея состоит в том, чтобы использовать фабрику записей журнала, чтобы добавить «цветные» атрибуты для записи объектов записи, а затем использовать эти «цветные» атрибуты в формате журнала.
Вы можете легко изменить этот пример для создания других цветных атрибутов (например, message_c), а затем использовать эти атрибуты, чтобы получить цветной текст (только), где вы хотите.
(полезный трюк, который я обнаружил недавно: у меня есть файл с цветными журналами отладки, и всякий раз, когда я хочу временно увеличить уровень журнала моего приложения, я просто
tail -f
записываю файл журнала в другой терминал и вижу на экране журналы отладки без изменения конфигурации и перезапуска приложения. )источник
Это еще один Python3 вариант примера airmind. Мне нужны были некоторые особенности, которых я не видел в других примерах
Примечания: я использовал колораму, но вы можете изменить это, так что это не требуется. Также для моего тестирования я просто запустил файл python, так что мой класс находится в модуле.
__main__
Вы должны были бы перейти(): __main__.ColoredFormatter
на любой другой модуль.logging.yaml
main.py
вывод:
источник