Spaces:
Runtime error
Runtime error
| import logging | |
| from logging.handlers import RotatingFileHandler | |
| import os | |
| from pathlib import Path | |
| from typing import Optional | |
| class LogManager: | |
| """Manages logging configuration and rotation for all agents""" | |
| def __init__(self, log_dir: str = "logs", max_bytes: int = 5_000_000, backup_count: int = 5): | |
| """Initialize log manager | |
| Args: | |
| log_dir: Directory to store log files | |
| max_bytes: Maximum size of each log file before rotation | |
| backup_count: Number of backup files to keep | |
| """ | |
| self.log_dir = Path(log_dir) | |
| self.max_bytes = max_bytes | |
| self.backup_count = backup_count | |
| # Create log directories | |
| self._create_log_dirs() | |
| # Configure root logger | |
| self._configure_root_logger() | |
| def _create_log_dirs(self): | |
| """Create necessary log directories""" | |
| dirs = [ | |
| self.log_dir, | |
| self.log_dir / "agents", | |
| self.log_dir / "system", | |
| self.log_dir / "analytics" | |
| ] | |
| for dir_path in dirs: | |
| dir_path.mkdir(parents=True, exist_ok=True) | |
| def _configure_root_logger(self): | |
| """Configure the root logger""" | |
| root_logger = logging.getLogger() | |
| root_logger.setLevel(logging.INFO) | |
| # System log handler | |
| system_handler = RotatingFileHandler( | |
| self.log_dir / "system" / "system.log", | |
| maxBytes=self.max_bytes, | |
| backupCount=self.backup_count | |
| ) | |
| system_handler.setLevel(logging.INFO) | |
| formatter = logging.Formatter( | |
| '%(asctime)s - %(name)s - %(levelname)s - %(message)s' | |
| ) | |
| system_handler.setFormatter(formatter) | |
| root_logger.addHandler(system_handler) | |
| def get_agent_logger(self, agent_name: str, log_level: int = logging.INFO) -> logging.Logger: | |
| """Get a configured logger for an agent | |
| Args: | |
| agent_name: Name of the agent (used in log file name) | |
| log_level: Logging level for this logger | |
| Returns: | |
| Configured logger instance | |
| """ | |
| logger = logging.getLogger(f"agent.{agent_name}") | |
| logger.setLevel(log_level) | |
| # Remove any existing handlers | |
| logger.handlers = [] | |
| # Add rotating file handler | |
| handler = RotatingFileHandler( | |
| self.log_dir / "agents" / f"{agent_name}.log", | |
| maxBytes=self.max_bytes, | |
| backupCount=self.backup_count | |
| ) | |
| handler.setLevel(log_level) | |
| formatter = logging.Formatter( | |
| '%(asctime)s - %(name)s - %(levelname)s - %(message)s' | |
| ) | |
| handler.setFormatter(formatter) | |
| logger.addHandler(handler) | |
| return logger | |
| def get_analytics_logger(self, name: str, log_level: int = logging.INFO) -> logging.Logger: | |
| """Get a configured logger for analytics | |
| Args: | |
| name: Analytics category name | |
| log_level: Logging level for this logger | |
| Returns: | |
| Configured logger instance | |
| """ | |
| logger = logging.getLogger(f"analytics.{name}") | |
| logger.setLevel(log_level) | |
| # Remove any existing handlers | |
| logger.handlers = [] | |
| # Add rotating file handler | |
| handler = RotatingFileHandler( | |
| self.log_dir / "analytics" / f"{name}.log", | |
| maxBytes=self.max_bytes, | |
| backupCount=self.backup_count | |
| ) | |
| handler.setLevel(log_level) | |
| formatter = logging.Formatter( | |
| '%(asctime)s - %(name)s - %(levelname)s - %(message)s' | |
| ) | |
| handler.setFormatter(formatter) | |
| logger.addHandler(handler) | |
| return logger | |
| def cleanup_old_logs(self, max_age_days: int = 30): | |
| """Clean up log files older than specified days | |
| Args: | |
| max_age_days: Maximum age of log files in days | |
| """ | |
| import time | |
| current_time = time.time() | |
| max_age_seconds = max_age_days * 24 * 60 * 60 | |
| for root, _, files in os.walk(self.log_dir): | |
| for file in files: | |
| file_path = os.path.join(root, file) | |
| if os.path.getmtime(file_path) < (current_time - max_age_seconds): | |
| try: | |
| os.remove(file_path) | |
| logging.info(f"Removed old log file: {file_path}") | |
| except Exception as e: | |
| logging.error(f"Error removing old log file {file_path}: {str(e)}") | |
| def get_log_stats(self) -> dict: | |
| """Get statistics about log files | |
| Returns: | |
| Dictionary containing log statistics | |
| """ | |
| stats = { | |
| "total_size": 0, | |
| "file_count": 0, | |
| "categories": {} | |
| } | |
| for root, _, files in os.walk(self.log_dir): | |
| category = os.path.basename(root) | |
| if category not in stats["categories"]: | |
| stats["categories"][category] = { | |
| "size": 0, | |
| "file_count": 0 | |
| } | |
| for file in files: | |
| file_path = os.path.join(root, file) | |
| size = os.path.getsize(file_path) | |
| stats["total_size"] += size | |
| stats["file_count"] += 1 | |
| stats["categories"][category]["size"] += size | |
| stats["categories"][category]["file_count"] += 1 | |
| return stats |