Implement user-specific question numbering and update database schema. Added triggers for automatic question numbering and adjustments upon deletion. Enhanced CRUD operations to manage user_question_number effectively.
This commit is contained in:
83
services/infrastructure/logger.py
Normal file
83
services/infrastructure/logger.py
Normal file
@@ -0,0 +1,83 @@
|
||||
"""
|
||||
Настройка системы логирования с использованием loguru
|
||||
"""
|
||||
import sys
|
||||
from loguru import logger
|
||||
from config import config
|
||||
|
||||
|
||||
def setup_logging():
|
||||
"""Настройка системы логирования"""
|
||||
# Удаляем стандартный обработчик loguru
|
||||
logger.remove()
|
||||
|
||||
# Настраиваем логирование в stderr для Docker
|
||||
log_level = "DEBUG" if config.DEBUG else "INFO"
|
||||
|
||||
# Основной обработчик для stderr (для Docker)
|
||||
logger.add(
|
||||
sys.stderr,
|
||||
level=log_level,
|
||||
format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
|
||||
colorize=True,
|
||||
backtrace=True,
|
||||
diagnose=True
|
||||
)
|
||||
|
||||
# Дополнительный обработчик для файла (опционально)
|
||||
if config.DEBUG:
|
||||
logger.add(
|
||||
"logs/bot.log",
|
||||
level="DEBUG",
|
||||
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
|
||||
rotation="10 MB",
|
||||
retention="7 days",
|
||||
compression="zip",
|
||||
backtrace=True,
|
||||
diagnose=True
|
||||
)
|
||||
|
||||
# Настраиваем логирование для внешних библиотек
|
||||
import logging
|
||||
|
||||
# Отключаем логирование aiogram по умолчанию
|
||||
logging.getLogger("aiogram").setLevel(logging.WARNING)
|
||||
logging.getLogger("aiohttp").setLevel(logging.WARNING)
|
||||
logging.getLogger("aiosqlite").setLevel(logging.WARNING)
|
||||
|
||||
# Перенаправляем стандартное логирование в loguru
|
||||
class InterceptHandler(logging.Handler):
|
||||
def emit(self, record):
|
||||
# Получаем соответствующий уровень loguru
|
||||
try:
|
||||
level = logger.level(record.levelname).name
|
||||
except ValueError:
|
||||
level = record.levelno
|
||||
|
||||
# Находим caller из логов
|
||||
frame, depth = logging.currentframe(), 2
|
||||
while frame.f_code.co_filename == logging.__file__:
|
||||
frame = frame.f_back
|
||||
depth += 1
|
||||
|
||||
logger.opt(depth=depth, exception=record.exc_info).log(
|
||||
level, record.getMessage()
|
||||
)
|
||||
|
||||
# Подключаем перехватчик к корневому логгеру
|
||||
logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True)
|
||||
|
||||
logger.info("🔧 Система логирования loguru настроена")
|
||||
logger.info(f"📊 Уровень логирования: {log_level}")
|
||||
logger.info(f"🐳 Логи выводятся в stderr для Docker")
|
||||
|
||||
|
||||
def get_logger(name: str = None):
|
||||
"""Получить логгер для модуля"""
|
||||
if name:
|
||||
return logger.bind(name=name)
|
||||
return logger
|
||||
|
||||
|
||||
# Инициализируем логирование при импорте
|
||||
setup_logging()
|
||||
Reference in New Issue
Block a user