diff --git a/app/bot.py b/app/bot.py index bdfac407..c3cd23bf 100644 --- a/app/bot.py +++ b/app/bot.py @@ -130,10 +130,13 @@ async def setup_bot() -> tuple[Bot, Dispatcher]: dp.callback_query.middleware(ThrottlingMiddleware()) # Middleware для автоматического логирования кликов по кнопкам + logger.info(f"📊 MENU_LAYOUT_ENABLED = {settings.MENU_LAYOUT_ENABLED}") if settings.MENU_LAYOUT_ENABLED: button_stats_middleware = ButtonStatsMiddleware() dp.callback_query.middleware(button_stats_middleware) logger.info("📊 ButtonStatsMiddleware активирован - автоматическое логирование кликов включено") + else: + logger.warning("⚠️ ButtonStatsMiddleware ОТКЛЮЧЕН - MENU_LAYOUT_ENABLED=False") if settings.CHANNEL_IS_REQUIRED_SUB: from app.middlewares.channel_checker import ChannelCheckerMiddleware diff --git a/app/middlewares/button_stats.py b/app/middlewares/button_stats.py index 66cfa25e..4263462a 100644 --- a/app/middlewares/button_stats.py +++ b/app/middlewares/button_stats.py @@ -21,33 +21,35 @@ class ButtonStatsMiddleware(BaseMiddleware): data: Dict[str, Any] ) -> Any: """Перехватывает CallbackQuery и логирует клики по кнопкам.""" - + # Обрабатываем только CallbackQuery if not isinstance(event, CallbackQuery): return await handler(event, data) - + # Пропускаем, если статистика отключена if not settings.MENU_LAYOUT_ENABLED: return await handler(event, data) - + # Логируем клик асинхронно, не блокируя обработку try: # Получаем callback_data callback_data = event.data if not callback_data: return await handler(event, data) - + # Получаем user_id user_id = event.from_user.id if event.from_user else None - + # Определяем тип кнопки по callback_data button_type = self._determine_button_type(callback_data) - + # Получаем текст кнопки, если возможно button_text = None if event.message and hasattr(event.message, 'reply_markup'): button_text = self._extract_button_text(event.message.reply_markup, callback_data) - + + logger.info(f"📊 ButtonStats: клик user={user_id}, button={callback_data[:50]}, type={button_type}") + # Логируем в фоне, не блокируя обработку # Используем asyncio.create_task для фоновой задачи import asyncio @@ -62,7 +64,7 @@ class ButtonStatsMiddleware(BaseMiddleware): ) except Exception as e: # Не прерываем обработку при ошибке логирования - logger.debug(f"Ошибка логирования клика по кнопке: {e}") + logger.error(f"Ошибка логирования клика по кнопке: {e}", exc_info=True) # Продолжаем обработку return await handler(event, data) @@ -104,7 +106,7 @@ class ButtonStatsMiddleware(BaseMiddleware): async with AsyncSessionLocal() as db: try: from app.services.menu_layout_service import MenuLayoutService - + await MenuLayoutService.log_button_click( db, button_id=button_id, @@ -113,8 +115,9 @@ class ButtonStatsMiddleware(BaseMiddleware): button_type=button_type, button_text=button_text ) + logger.info(f"✅ ButtonStats: записано в БД button={button_id[:30]}, user={user_id}") except Exception as e: - logger.error(f"Ошибка логирования клика по кнопке {button_id}: {e}") + logger.error(f"❌ Ошибка записи клика в БД {button_id}: {e}", exc_info=True) except Exception as e: - logger.error(f"Ошибка создания сессии БД для логирования клика: {e}") + logger.error(f"❌ Ошибка создания сессии БД для логирования клика: {e}", exc_info=True)