Files
fckbot/rag/utils/logger.py
2026-06-30 22:31:06 +00:00

90 lines
3.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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)