|
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 {} |
|
} |
|
|
|
|
|
key = f"analytics:user_events:{user_id}:{int(time.time())}" |
|
self.redis_client.setex( |
|
key, |
|
2592000, |
|
json.dumps(event_data) |
|
) |
|
|
|
|
|
global_key = f"analytics:global_events:{int(time.time())}" |
|
self.redis_client.setex( |
|
global_key, |
|
2592000, |
|
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) |
|
|
|
|
|
user_logger = UserLogger() |
|
|