Исходный код candidate.logging_config
"""Файл для настройки ведения журнала с цветным выводом."""
import logging
from logging import Formatter, LogRecord, StreamHandler
from typing import Dict
LOG_COLORS: Dict[str, str] = {
"DEBUG": "#4b8bf5", # Light blue
"INFO": "#2ecc71", # Green
"WARNING": "#f1c40f", # Yellow
"ERROR": "#e74c3c", # Red
"CRITICAL": "#8b0000", # Dark red
}
RESET_COLOR = "\x1b[0m"
[документация]
def hex_to_ansi(hex_color: str) -> str:
"""Конвертирует HEX-код цвета в ANSI escape-последовательность.
Args:
hex_color (str): HEX-код цвета в формате '#RRGGBB'
Returns:
str: ANSI escape-последовательность для цвета или пустая строка при ошибке
"""
hex_color = hex_color.lstrip("#")
if len(hex_color) != 6:
return ""
try:
r = int(hex_color[0:2], 16)
g = int(hex_color[2:4], 16)
b = int(hex_color[4:6], 16)
except ValueError:
return ""
return f"\x1b[38;2;{r};{g};{b}m"
[документация]
class ColoredFormatter(Formatter):
"""Кастомный форматтер для добавления цветов в логи с помощью ANSI-кодов.
Цвета определяются на основе уровня логирования в соответствии с LOG_COLORS."""
[документация]
def format(self, record: LogRecord) -> str:
"""Форматирует запись лога с добавлением цветовых кодов.
Args:
record (LogRecord): Запись лога для форматирования
Returns:
str: Отформатированное сообщение с цветовыми кодами
"""
color_code = hex_to_ansi(LOG_COLORS.get(record.levelname, ""))
message = super().format(record)
return f"{color_code}{message}{RESET_COLOR}"
[документация]
def configure_logging(level: int = logging.INFO) -> None:
"""Настраивает корневой логгер с обработчиком цветного вывода.
Args:
level (int): Уровень логирования (logging.INFO или logging.DEBUG).
По умолчанию: logging.INFO.
Raises:
ValueError: Если указан недопустимый уровень логирования
Примечание:
Поддерживаются только уровни logging.INFO и logging.DEBUG
"""
if level != logging.INFO and level != logging.DEBUG:
raise ValueError("You can use only logging.info or logging.debug")
handler = StreamHandler()
handler.setFormatter(
ColoredFormatter(
fmt="%(asctime)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S"
)
)
logger = logging.getLogger()
logger.setLevel(level)
logger.addHandler(handler)