""" Logging utilities for the Edison application. """ import logging import os import sys def setup_logging(verbose=False): """ Configure logging for the application. Args: verbose: If True, enable DEBUG level messages. If False, show only WARNING and above. Returns: logging.Logger: The configured logger. """ # Create logs directory if it doesn't exist script_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) logs_dir = os.path.join(script_dir, "logs") os.makedirs(logs_dir, exist_ok=True) # Determine log levels based on verbose flag # Always save INFO+ logs to file, but console output depends on verbose flag file_level = logging.INFO console_level = logging.DEBUG if verbose else logging.WARNING # Configure file and console handlers with different levels file_handler = logging.FileHandler(os.path.join(logs_dir, 'edison.log')) file_handler.setLevel(file_level) console_handler = logging.StreamHandler(sys.stderr) console_handler.setLevel(console_level) # We need to set the root logger level to the lowest of our handlers root_level = logging.DEBUG if verbose else logging.INFO # Basic config with handlers logging.basicConfig( level=root_level, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[file_handler, console_handler] ) # Always disable httpx and urllib3 debug logs unless in verbose mode if not verbose: logging.getLogger("httpx").setLevel(logging.WARNING) logging.getLogger("urllib3").setLevel(logging.WARNING) # Get the main application logger logger = logging.getLogger('edison') # Log setup confirmation at appropriate level if verbose: logger.debug("Verbose logging enabled (DEBUG level)") else: logger.info("Standard logging configuration applied (INFO to file, WARNING to console)") return logger def get_logger(name): """ Get a logger for the specified name. Args: name: The name of the logger. Returns: logging.Logger: The logger. """ return logging.getLogger(name)