Как я могу раскрасить вывод журнала Python? - PullRequest
296 голосов
/ 21 декабря 2008

Некоторое время назад я видел приложение Mono с цветным выводом, вероятно, из-за его системы журналов (потому что все сообщения были стандартизированы).

Теперь в Python есть модуль logging, который позволяет вам указать множество параметров для настройки вывода. Итак, я представляю, что подобное возможно с Python, но я не могу найти, как это сделать где-либо.

Есть ли способ сделать вывод модуля Python logging в цвете?

Что я хочу (например) ошибки в красном, отладочные сообщения в синем или желтом, и так далее.

Конечно, для этого, вероятно, потребуется совместимый терминал (большинство современных терминалов); но я могу вернуться к исходному выводу logging, если цвет не поддерживается.

Есть идеи, как получить цветной вывод с помощью модуля регистрации?

Ответы [ 24 ]

0 голосов
/ 19 мая 2013

Только что ответил на аналогичный вопрос: Python | изменить цвет текста в оболочке

Идея состоит в том, чтобы использовать библиотеку clint . Который имеет поддержку оболочек MAC, Linux и Windows (CLI).

0 голосов
/ 30 июля 2017

Просто еще одно решение, с цветами ZetaSyanthis:

def config_log(log_level):

    def set_color(level, code):
        level_fmt = "\033[1;" + str(code) + "m%s\033[1;0m" 
        logging.addLevelName( level, level_fmt % logging.getLevelName(level) )

    std_stream = sys.stdout
    isatty = getattr(std_stream, 'isatty', None)
    if isatty and isatty():
        levels = [logging.DEBUG, logging.CRITICAL, logging.WARNING, logging.ERROR]
        for idx, level in enumerate(levels):
            set_color(level, 30 + idx )
        set_color(logging.DEBUG, 0)
    logging.basicConfig(stream=std_stream, level=log_level)

вызовите его один раз из вашей __main__ функции. У меня там что-то вроде этого:

options, arguments = p.parse_args()
log_level = logging.DEBUG if options.verbose else logging.WARNING
config_log(log_level)

также проверяет, является ли вывод консолью, иначе цвета не используются.

0 голосов
/ 28 февраля 2017
import logging

logging.basicConfig(filename="f.log" filemode='w', level=logging.INFO,
                    format = "%(logger_name)s %(color)s  %(message)s %(endColor)s")


class Logger(object):
    __GREEN = "\033[92m"
    __RED = '\033[91m'
    __ENDC = '\033[0m'

    def __init__(self, name):
        self.logger = logging.getLogger(name)
        self.extra={'logger_name': name, 'endColor': self.__ENDC, 'color': self.__GREEN}


    def info(self, msg):
        self.extra['color'] = self.__GREEN
        self.logger.info(msg, extra=self.extra)

    def error(self, msg):
        self.extra['color'] = self.__RED
        self.logger.error(msg, extra=self.extra)

Использование

Logger("File Name").info("This shows green text")

0 голосов
/ 01 февраля 2015

Использование pyfancy .

Пример:

print(pyfancy.RED + "Hello Red!" + pyfancy.END)
...