# -*- coding: utf-8 -*- """ Настройка логирования для бота. Создаёт логгер с выводом в консоль и в файл. Уровень логирования может быть установлен в конфиге (DEBUG для разработки, INFO для production). Изменения: удалён aiomysql из списка шумных библиотек (заменён на asyncpg). Добавлена поддержка JSON-логирования через python-json-logger. """ import logging import sys from pathlib import Path from pythonjsonlogger import jsonlogger def setup_logging( profile_name: str, log_file: Path, log_level: int = logging.INFO, json_format: bool = False ) -> None: """ Инициализирует логирование: - вывод в консоль (StreamHandler) - вывод в файл (FileHandler) - снижает уровень шума для сторонних библиотек (slixmpp, asyncpg, qdrant_client и др.) Аргументы: profile_name: имя профиля бота (может использоваться в JSON-логах) log_file: путь к файлу лога log_level: уровень логирования json_format: если True, использовать JSON-формат (через python-json-logger) """ # Получаем корневой логгер и очищаем существующие обработчики root_logger = logging.getLogger() for handler in root_logger.handlers[:]: root_logger.removeHandler(handler) # Создаём обработчики stream_handler = logging.StreamHandler(sys.stdout) file_handler = logging.FileHandler(log_file, encoding='utf-8') # Формат даты для обычного лога date_format = '%Y-%m-%d %H:%M:%S' if json_format: # JSON-форматтер json_formatter = jsonlogger.JsonFormatter( fmt='%(asctime)s %(levelname)s %(name)s %(message)s', datefmt=date_format, json_ensure_ascii=False # поддержка русского языка ) # Можно добавить статическое поле "service" с именем профиля # но это делается через extra, пока оставим как есть stream_handler.setFormatter(json_formatter) file_handler.setFormatter(json_formatter) else: # Стандартный формат log_format = '%(asctime)s [%(levelname)s] %(name)s: %(message)s' formatter = logging.Formatter(log_format, datefmt=date_format) stream_handler.setFormatter(formatter) file_handler.setFormatter(formatter) # Устанавливаем уровень для обработчиков stream_handler.setLevel(log_level) file_handler.setLevel(log_level) # Добавляем обработчики к корневому логгеру root_logger.addHandler(stream_handler) root_logger.addHandler(file_handler) # Устанавливаем уровень для корневого логгера root_logger.setLevel(log_level) # Уменьшаем многословность некоторых библиотек (они пишут много DEBUG) noisy_loggers = [ "slixmpp", "asyncpg", "qdrant_client", "httpx", "gigachat", "urllib3", "asyncio", "aiohttp", "requests", ] for lib in noisy_loggers: logging.getLogger(lib).setLevel(logging.WARNING)