""" Centralized Logging Configuration """ import logging import sys from pathlib import Path # ANSI color codes COLORS = { "DEBUG": "\033[36m", # Cyan "INFO": "\033[32m", # Green "WARNING": "\033[33m", # Yellow "ERROR": "\033[31m", # Red "CRITICAL": "\033[35m", # Magenta "RESET": "\033[0m", # Reset } class ColoredFormatter(logging.Formatter): """Custom formatter with colors for terminal output""" def format(self, record): # Add color to level name levelname = record.levelname if levelname in COLORS: record.levelname = f"{COLORS[levelname]}{levelname}{COLORS['RESET']}" return super().format(record) import os # ... (omitted) def setup_logger(name="ContentAutomation", level=None, log_file=None): """ Configure and return a logger. Configures the ROOT logger to ensure consistent formatting across all modules. Default level is INFO, or DEBUG if VERBOSE env var is set. """ if level is None: level = logging.DEBUG if os.getenv("VERBOSE", "false").lower() == "true" else logging.INFO # Configure Root Logger root_logger = logging.getLogger() # Always update the level (in case of reload or dynamic change) root_logger.setLevel(level) # Avoid adding handlers multiple times to root if not root_logger.handlers: # Console handler with colors console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(level) console_formatter = ColoredFormatter(fmt="%(asctime)s | %(levelname)s | %(message)s", datefmt="%H:%M:%S") console_handler.setFormatter(console_formatter) root_logger.addHandler(console_handler) # File handler if specified if log_file: log_path = Path(log_file) log_path.parent.mkdir(parents=True, exist_ok=True) file_handler = logging.FileHandler(log_file) file_handler.setLevel(level) file_formatter = logging.Formatter( fmt="%(asctime)s | %(levelname)s | %(name)s | %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) file_handler.setFormatter(file_formatter) root_logger.addHandler(file_handler) else: # If handlers exist, ensure they also respect the new level for handler in root_logger.handlers: handler.setLevel(level) # Return the specific logger instance return logging.getLogger(name) # Global logger instance logger = setup_logger()