"""Единая настройка логгера — цветной вывод через colorlog. Использование: from logger_setup import setup_logger logger = setup_logger("main") Цвета по уровню: DEBUG — серый INFO — зелёный WARNING — жёлтый ERROR — красный CRITICAL — пурпурный (фон) Если colorlog не установлен — fallback на обычный logging без цвета. """ import logging import sys def setup_logger(name: str = "parser", level: int = logging.INFO) -> logging.Logger: """Настроить и вернуть логгер с цветным выводом.""" logger = logging.getLogger(name) if logger.handlers: # Уже настроен — не плодим хендлеры return logger logger.setLevel(level) logger.propagate = False # не дублируем в root logger handler = logging.StreamHandler(stream=sys.stdout) # stdout — PyCharm не красит красным try: from colorlog import ColoredFormatter formatter = ColoredFormatter( "%(log_color)s%(asctime)s | %(levelname)-7s%(reset)s | %(message)s", datefmt="%H:%M:%S", log_colors={ "DEBUG": "cyan", "INFO": "green", "WARNING": "yellow", "ERROR": "red", "CRITICAL": "red,bg_white", }, ) except ImportError: # colorlog не установлен — обычный формат без цветов formatter = logging.Formatter( "%(asctime)s | %(levelname)-7s | %(message)s", datefmt="%H:%M:%S", ) handler.setFormatter(formatter) logger.addHandler(handler) return logger def configure_root_logger(level: int = logging.INFO) -> None: """Перенастроить root logger — подхватят все модули которые используют logging.getLogger().""" root = logging.getLogger() # Убираем существующие хендлеры (basicConfig мог их добавить) for h in list(root.handlers): root.removeHandler(h) root.setLevel(level) handler = logging.StreamHandler(stream=sys.stdout) try: from colorlog import ColoredFormatter formatter = ColoredFormatter( "%(log_color)s%(asctime)s | %(levelname)-7s%(reset)s | %(name)s | %(message)s", datefmt="%H:%M:%S", log_colors={ "DEBUG": "cyan", "INFO": "green", "WARNING": "yellow", "ERROR": "red", "CRITICAL": "red,bg_white", }, ) except ImportError: formatter = logging.Formatter( "%(asctime)s | %(levelname)-7s | %(name)s | %(message)s", datefmt="%H:%M:%S", ) handler.setFormatter(formatter) root.addHandler(handler)