Редактировать logger.py

This commit is contained in:
Markov Andrey
2026-06-30 22:31:06 +00:00
parent f63bacc671
commit 2a9a2c2789

View File

@@ -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)
logging.getLogger(lib).setLevel(logging.WARNING)