From 2a9a2c27896f7777eaceac4ac707924d4d90a320 Mon Sep 17 00:00:00 2001 From: Markov Andrey Date: Tue, 30 Jun 2026 22:31:06 +0000 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20logger.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rag/utils/logger.py | 77 +++++++++++++++++++++++++++++++++------------ 1 file changed, 57 insertions(+), 20 deletions(-) diff --git a/rag/utils/logger.py b/rag/utils/logger.py index d4a9006..9377313 100644 --- a/rag/utils/logger.py +++ b/rag/utils/logger.py @@ -5,49 +5,86 @@ Уровень логирования может быть установлен в конфиге (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): + +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) """ - log_format = '%(asctime)s [%(levelname)s] %(name)s: %(message)s' - # Формат даты: 2026-05-20 15:30:00 + # Получаем корневой логгер и очищаем существующие обработчики + 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' - # Настройка корневого логгера - logging.basicConfig( - level=log_level, - format=log_format, - datefmt=date_format, - handlers=[ - logging.StreamHandler(sys.stdout), # вывод в консоль - logging.FileHandler(log_file, encoding='utf-8') # вывод в файл - ] - ) + 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", # вместо aiomysql (PostgreSQL) + "asyncpg", "qdrant_client", "httpx", "gigachat", "urllib3", "asyncio", - "aiohttp" + "aiohttp", + "requests", ] for lib in noisy_loggers: - logging.getLogger(lib).setLevel(logging.WARNING) - - # Для особо шумных можно ещё снизить, но оставляем WARNING - logging.getLogger("requests").setLevel(logging.WARNING) - logging.getLogger("urllib3").setLevel(logging.WARNING) \ No newline at end of file + logging.getLogger(lib).setLevel(logging.WARNING) \ No newline at end of file