Редактировать logger.py
This commit is contained in:
@@ -5,49 +5,86 @@
|
|||||||
Уровень логирования может быть установлен в конфиге (DEBUG для разработки, INFO для production).
|
Уровень логирования может быть установлен в конфиге (DEBUG для разработки, INFO для production).
|
||||||
|
|
||||||
Изменения: удалён aiomysql из списка шумных библиотек (заменён на asyncpg).
|
Изменения: удалён aiomysql из списка шумных библиотек (заменён на asyncpg).
|
||||||
|
Добавлена поддержка JSON-логирования через python-json-logger.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
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)
|
- вывод в консоль (StreamHandler)
|
||||||
- вывод в файл (FileHandler)
|
- вывод в файл (FileHandler)
|
||||||
- снижает уровень шума для сторонних библиотек (slixmpp, asyncpg, qdrant_client и др.)
|
- снижает уровень шума для сторонних библиотек (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'
|
date_format = '%Y-%m-%d %H:%M:%S'
|
||||||
|
|
||||||
# Настройка корневого логгера
|
if json_format:
|
||||||
logging.basicConfig(
|
# JSON-форматтер
|
||||||
level=log_level,
|
json_formatter = jsonlogger.JsonFormatter(
|
||||||
format=log_format,
|
fmt='%(asctime)s %(levelname)s %(name)s %(message)s',
|
||||||
datefmt=date_format,
|
datefmt=date_format,
|
||||||
handlers=[
|
json_ensure_ascii=False # поддержка русского языка
|
||||||
logging.StreamHandler(sys.stdout), # вывод в консоль
|
)
|
||||||
logging.FileHandler(log_file, encoding='utf-8') # вывод в файл
|
# Можно добавить статическое поле "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)
|
# Уменьшаем многословность некоторых библиотек (они пишут много DEBUG)
|
||||||
noisy_loggers = [
|
noisy_loggers = [
|
||||||
"slixmpp",
|
"slixmpp",
|
||||||
"asyncpg", # вместо aiomysql (PostgreSQL)
|
"asyncpg",
|
||||||
"qdrant_client",
|
"qdrant_client",
|
||||||
"httpx",
|
"httpx",
|
||||||
"gigachat",
|
"gigachat",
|
||||||
"urllib3",
|
"urllib3",
|
||||||
"asyncio",
|
"asyncio",
|
||||||
"aiohttp"
|
"aiohttp",
|
||||||
|
"requests",
|
||||||
]
|
]
|
||||||
for lib in noisy_loggers:
|
for lib in noisy_loggers:
|
||||||
logging.getLogger(lib).setLevel(logging.WARNING)
|
logging.getLogger(lib).setLevel(logging.WARNING)
|
||||||
|
|
||||||
# Для особо шумных можно ещё снизить, но оставляем WARNING
|
|
||||||
logging.getLogger("requests").setLevel(logging.WARNING)
|
|
||||||
logging.getLogger("urllib3").setLevel(logging.WARNING)
|
|
||||||
Reference in New Issue
Block a user