""" Logging utilities for the MONA application Fixed version with all required functions """ import logging import os import sys from datetime import datetime from pathlib import Path def setup_logging(log_level=logging.INFO, log_file=None): """ Set up logging configuration Args: log_level: Logging level (default: INFO) log_file: Optional log file path """ # Create logs directory if it doesn't exist if log_file: log_dir = Path(log_file).parent log_dir.mkdir(exist_ok=True) # Configure logging format formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) # Set up root logger root_logger = logging.getLogger() root_logger.setLevel(log_level) # Clear existing handlers root_logger.handlers.clear() # Console handler console_handler = logging.StreamHandler(sys.stdout) console_handler.setFormatter(formatter) root_logger.addHandler(console_handler) # File handler if specified if log_file: file_handler = logging.FileHandler(log_file) file_handler.setFormatter(formatter) root_logger.addHandler(file_handler) def get_logger(name=None): """ Get a logger instance Args: name: Logger name (default: __name__) Returns: logging.Logger: Logger instance """ if name is None: name = __name__ logger = logging.getLogger(name) # If no handlers are set up, set up basic logging if not logger.handlers and not logging.getLogger().handlers: setup_logging() return logger def log_error(message, error=None, extra_data=None): """ Log error messages with optional error details and extra data Args: message (str): The error message to log error (Exception, optional): The exception object if available extra_data (dict, optional): Additional data to include in log """ logger = get_logger() if error: error_msg = f"{message}: {str(error)}" if hasattr(error, '__traceback__'): import traceback error_msg += f"\nTraceback: {traceback.format_exc()}" else: error_msg = message if extra_data: logger.error(error_msg, extra=extra_data) else: logger.error(error_msg) def log_warning(message, extra_data=None): """ Log warning messages Args: message (str): The warning message to log extra_data (dict, optional): Additional data to include in log """ logger = get_logger() if extra_data: logger.warning(message, extra=extra_data) else: logger.warning(message) def log_info(message, extra_data=None): """ Log info messages Args: message (str): The info message to log extra_data (dict, optional): Additional data to include in log """ logger = get_logger() if extra_data: logger.info(message, extra=extra_data) else: logger.info(message) def log_debug(message, extra_data=None): """ Log debug messages Args: message (str): The debug message to log extra_data (dict, optional): Additional data to include in log """ logger = get_logger() if extra_data: logger.debug(message, extra=extra_data) else: logger.debug(message) def log_exception(message, exc_info=True): """ Log exceptions with full traceback Args: message (str): The exception message to log exc_info (bool): Whether to include exception info """ logger = get_logger() logger.exception(message, exc_info=exc_info) # Initialize logging when module is imported if __name__ != "__main__": setup_logging()