import logging import sys import time from typing import Optional from functools import wraps def setup_logging(level: str = "INFO", log_file: Optional[str] = None): """Setup logging configuration for A2A agents.""" formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) # Console handler console_handler = logging.StreamHandler(sys.stdout) console_handler.setFormatter(formatter) # Root logger logger = logging.getLogger() logger.setLevel(getattr(logging, level.upper())) logger.addHandler(console_handler) # File handler if specified if log_file: file_handler = logging.FileHandler(log_file) file_handler.setFormatter(formatter) logger.addHandler(file_handler) return logger def log_performance(func): """Decorator to log function performance.""" @wraps(func) async def wrapper(*args, **kwargs): logger = logging.getLogger(func.__module__) start_time = time.time() logger.info(f"Starting {func.__name__}") try: result = await func(*args, **kwargs) duration = time.time() - start_time logger.info(f"Completed {func.__name__} in {duration:.2f}s") return result except Exception as e: duration = time.time() - start_time logger.error(f"Failed {func.__name__} after {duration:.2f}s: {e}") raise return wrapper