creative-x-ferrero/utils/logger.py
DJP 72e9b54ff6 Initial commit: CreativeX API integration for Ferrero assets
- Ferrero filename parser with NEW format support
- CreativeX API client with retry logic
- State persistence with resume capability
- Upload and status checking scripts
- Comprehensive documentation
- Virtual environment support
2026-01-09 14:33:00 -05:00

77 lines
2 KiB
Python

"""
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)