import json import time import logging from typing import Dict, Any, Optional from datetime import datetime from core.redis_client import redis_client logger = logging.getLogger(__name__) class UserLogger: """Comprehensive user interaction logging system""" def __init__(self): self.redis_client = redis_client.get_client() def log_user_action(self, user_id: str, action: str, details: Dict[str, Any] = None): """Log a user action""" try: event_data = { "user_id": user_id, "action": action, "timestamp": datetime.now().isoformat(), "details": details or {} } # Store in Redis with expiration (30 days) key = f"analytics:user_events:{user_id}:{int(time.time())}" self.redis_client.setex( key, 2592000, # 30 days in seconds json.dumps(event_data) ) # Also store in global events global_key = f"analytics:global_events:{int(time.time())}" self.redis_client.setex( global_key, 2592000, # 30 days in seconds json.dumps(event_data) ) logger.info(f"Logged user action: {user_id} - {action}") except Exception as e: logger.error(f"Failed to log user action: {e}") def log_ui_state(self, user_id: str, state: str, details: Dict[str, Any] = None): """Log UI state changes""" self.log_user_action(user_id, f"ui_state_{state}", details) def log_performance_metric(self, user_id: str, metric_name: str, value: float, details: Dict[str, Any] = None): """Log performance metrics""" metric_details = { "value": value, "metric": metric_name } if details: metric_details.update(details) self.log_user_action(user_id, f"performance_{metric_name}", metric_details) def log_error(self, user_id: str, error_type: str, error_message: str, details: Dict[str, Any] = None): """Log errors""" error_details = { "error_type": error_type, "error_message": error_message } if details: error_details.update(details) self.log_user_action(user_id, f"error_{error_type}", error_details) def log_feedback(self, user_id: str, rating: int, comment: str = "", details: Dict[str, Any] = None): """Log user feedback""" feedback_details = { "rating": rating, "comment": comment } if details: feedback_details.update(details) self.log_user_action(user_id, "user_feedback", feedback_details) # Global instance user_logger = UserLogger()