""" Logging configuration for the Modius Agent Performance application. """ import logging import logging.handlers from typing import Optional from ..config.constants import LOGGING_CONFIG def setup_logging(level: Optional[str] = None, log_file: Optional[str] = None) -> None: """Set up logging configuration.""" log_level = level or LOGGING_CONFIG['level'] log_file = log_file or LOGGING_CONFIG['file'] log_format = LOGGING_CONFIG['format'] # Convert string level to logging constant if isinstance(log_level, str): log_level = getattr(logging, log_level.upper()) # Create logger logger = logging.getLogger() logger.setLevel(log_level) # Clear existing handlers logger.handlers.clear() # Create formatter formatter = logging.Formatter(log_format) # Console handler console_handler = logging.StreamHandler() console_handler.setLevel(log_level) console_handler.setFormatter(formatter) logger.addHandler(console_handler) # File handler with rotation if log_file: file_handler = logging.handlers.RotatingFileHandler( log_file, maxBytes=10*1024*1024, # 10MB backupCount=5 ) file_handler.setLevel(log_level) file_handler.setFormatter(formatter) logger.addHandler(file_handler) # Reduce third-party library logging logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger("httpx").setLevel(logging.WARNING) logging.getLogger("matplotlib").setLevel(logging.WARNING) logging.getLogger("requests").setLevel(logging.WARNING) # Log startup information logger.info("============= APPLICATION STARTING =============") logger.info(f"Logging level set to: {logging.getLevelName(log_level)}") if log_file: logger.info(f"Logging to file: {log_file}") def get_logger(name: str) -> logging.Logger: """Get a logger instance.""" return logging.getLogger(name)