Добавить новый цветной журнал уровня

Таким образом, этот код выводит имена уровней с цветами (уровни по умолчанию), и я хотел бы добавить свои собственные дополнительные уровни, а затем присвоить им собственный цвет.

Код:

import logging
import re
import time
import sys

def set_colour(level):
    """
    Sets colour of text for the level name in
    logging statements using a dispatcher.
    """
    escaped = "[\033[1;%sm%s\033[1;0m]"
    return {
        'INFO': lambda: logging.addLevelName(logging.INFO, escaped % ('94', level)),
        'WARNING': lambda: logging.addLevelName(logging.ERROR, escaped % ('93', level)),
        'ERROR': lambda: logging.addLevelName(logging.WARNING, escaped % ('91', level))
    }.get(level, lambda: None)()


class NoColorFormatter(logging.Formatter):
    """
    Log formatter that strips terminal colour
    escape codes from the log message.
    """

    # Regex for ANSI colour codes
    ANSI_RE = re.compile(r"\x1b\[[0-9;]*m")

    def format(self, record):
        """Return logger message with terminal escapes removed."""
        return "%s %s %s" % (
            time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
            re.sub(self.ANSI_RE, "", record.levelname),
            record.msg,
        )

# Create logger
logger = logging.getLogger(__package__)

# Create formatters
logformatter = NoColorFormatter()
colorformatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s")

# Set logging colours
for level in 'INFO', 'ERROR', 'WARNING':
    set_colour(level)

# Set logging level
logger.setLevel(logging.INFO)

# Set log handlers
loghandler = logging.FileHandler("log.txt", mode="a", encoding="utf8")
streamhandler = logging.StreamHandler(sys.stdout)

# Set log formatters
loghandler.setFormatter(logformatter)
streamhandler.setFormatter(colorformatter)

# Attach log handlers to logger
logger.addHandler(loghandler)
logger.addHandler(streamhandler)

# Example logging statements
logging.info("This is just an information for you")
logging.warning("This is just a warning for you")
logging.error("This is just an error for you")

Чего я хочу добиться, так это нового уровня, но с его уникальным цветом.

Вот код того, как я добавляю новый уровень:

def success(msg, *args, **kwargs):
    if logging.getLogger().isEnabledFor(70):
        logging.log(70, msg)

logging.addLevelName(70, "SUCCESS")
logging.success = success
logging.Logger.success = success

Приведенный выше код нормально работает, но не включает цвета. Как я могу добавить этот код, чтобы был новый уровень, но с другим цветом?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
21
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это требует добавления нескольких строк, включая этот блок (с добавлением еще одной строки для установки целочисленного значения для logging.SUCCESS:

def success(msg, *args, **kwargs):
    if logging.getLogger().isEnabledFor(70):
        logging.log(70, msg)

logging.addLevelName(70, "SUCCESS")
logging.SUCCESS = 70   # similar to logging.INFO -> 20
logging.success = success
logging.Logger.success = success

Я указал строки, которые были добавлены/изменены здесь. Чтобы добавить дополнительные уровни, достаточно определить те же структуры для новых и изменить цикл for и функции set_colour().

import logging
import re
import time
import sys

def set_colour(level):
    """
    Sets colour of text for the level name in
    logging statements using a dispatcher.
    """
    escaped = "[\033[1;%sm%s\033[1;0m]"
    return {
        'INFO': lambda: logging.addLevelName(logging.INFO, escaped % ('94', level)),
        'WARNING': lambda: logging.addLevelName(logging.ERROR, escaped % ('93', level)),
        'ERROR': lambda: logging.addLevelName(logging.WARNING, escaped % ('91', level)),
        'SUCCESS': lambda: logging.addLevelName(logging.SUCCESS, escaped % ('31', level))   # new
    }.get(level, lambda: None)()


class NoColorFormatter(logging.Formatter):
    """
    Log formatter that strips terminal colour
    escape codes from the log message.
    """

    # Regex for ANSI colour codes
    ANSI_RE = re.compile(r"\x1b\[[0-9;]*m")

    def format(self, record):
        """Return logger message with terminal escapes removed."""
        return "%s %s %s" % (
            time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
            re.sub(self.ANSI_RE, "", record.levelname),
            record.msg,
        )

def success(msg, *args, **kwargs):   # new
    if logging.getLogger().isEnabledFor(70):   # new
        logging.log(70, msg)   # new

# Create logger
logger = logging.getLogger(__package__)

# Create formatters
logformatter = NoColorFormatter()
colorformatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s")

# Create new level
logging.SUCCESS = 70   # new
logging.success = success   # new
logging.Logger.success = success   # new

# Set logging colours
for level in 'INFO', 'ERROR', 'WARNING', 'SUCCESS':   # modified
    set_colour(level)

# Set logging level
logger.setLevel(logging.INFO)

# Set log handlers
loghandler = logging.FileHandler("log.txt", mode="w", encoding="utf8")
streamhandler = logging.StreamHandler(sys.stdout)

# Set log formatters
loghandler.setFormatter(logformatter)
streamhandler.setFormatter(colorformatter)

# Attach log handlers to logger
logger.addHandler(loghandler)
logger.addHandler(streamhandler)

# Example logging statements
logging.info("This is just an information for you")
logging.warning("This is just an information for you")
logging.error("This is just an information for you")
logging.success("This is just an information for you")

Другие вопросы по теме