Spaces:
Runtime error
Runtime error
File size: 5,732 Bytes
f83b968 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
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 |