""" Central logging service for EventifyLogger. """ import json from eventify_logger.models import EventifyLogger def _get_client_ip(request): """Extract client IP from request.""" if not request: return None x_forwarded = request.META.get("HTTP_X_FORWARDED_FOR") if x_forwarded: return x_forwarded.split(",")[0].strip() or None return request.META.get("REMOTE_ADDR") def _get_user_agent(request): """Extract User-Agent from request.""" if not request: return None return request.META.get("HTTP_USER_AGENT", "") def log(logger_type, logger_message, request=None, user=None, logger_data=None): """ Create an EventifyLogger record. Args: logger_type: 'info' | 'warning' | 'error' | 'critical' logger_message: str request: optional HttpRequest (used for IP, user-agent, user if not provided) user: optional User (overrides request.user) logger_data: optional str or dict (dict will be JSON-serialized) """ try: resolved_user = user if resolved_user is None and request and hasattr(request, "user"): resolved_user = getattr(request.user, "is_authenticated", False) and request.user or None ip_address = _get_client_ip(request) if request else None user_agent = _get_user_agent(request) if request else None if isinstance(logger_data, dict): logger_data = json.dumps(logger_data) EventifyLogger.objects.create( logger_type=logger_type, logger_message=str(logger_message)[:10000], # cap message length logger_data=logger_data[:10000] if logger_data else None, # cap data length logged_user=resolved_user, logged_ip_address=ip_address, logged_user_device=None, # defer UA parsing logged_user_browser=user_agent[:250] if user_agent else None, ) except Exception: pass # Never let logging break the app