""" Logging configuration for CreativeX API Integration """ import logging import sys from datetime import datetime from pathlib import Path from typing import Optional def setup_logger( name: str, log_dir: Optional[Path] = None, log_level: str = "INFO", console_output: bool = True ) -> logging.Logger: """ Configure and return a logger with file and console handlers Args: name: Logger name (typically __name__ from calling module) log_dir: Directory for log files (None to skip file logging) log_level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL) console_output: Whether to output to console Returns: logging.Logger: Configured logger instance """ # Create logger logger = logging.getLogger(name) logger.setLevel(getattr(logging, log_level.upper())) # Prevent duplicate handlers if logger.handlers: return logger # Create formatter formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) # Console handler if console_output: console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.INFO) console_handler.setFormatter(formatter) logger.addHandler(console_handler) # File handler if log_dir: log_dir.mkdir(parents=True, exist_ok=True) timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') log_file = log_dir / f'creativex_{timestamp}.log' file_handler = logging.FileHandler(log_file, encoding='utf-8') file_handler.setLevel(logging.DEBUG) # File gets everything file_handler.setFormatter(formatter) logger.addHandler(file_handler) logger.info(f"Logging to file: {log_file}") return logger def get_logger(name: str) -> logging.Logger: """ Get an existing logger or create a basic one Args: name: Logger name Returns: logging.Logger: Logger instance """ return logging.getLogger(name)