"""
Logging configuration for SPARKNET
Provides structured logging with multiple outputs
"""
import sys
from pathlib import Path
from loguru import logger
from typing import Optional
def setup_logging(
log_level: str = "INFO",
log_file: Optional[str] = None,
rotation: str = "100 MB",
retention: str = "7 days",
colorize: bool = True,
):
"""
Configure logging for SPARKNET.
Args:
log_level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
log_file: Path to log file or None for no file logging
rotation: Log rotation size
retention: Log retention period
colorize: Enable colored output
"""
# Remove default logger
logger.remove()
# Add console handler
logger.add(
sys.stderr,
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
level=log_level,
colorize=colorize,
)
# Add file handler if specified
if log_file:
log_path = Path(log_file)
log_path.parent.mkdir(parents=True, exist_ok=True)
logger.add(
log_file,
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
level=log_level,
rotation=rotation,
retention=retention,
compression="zip",
)
logger.info(f"Logging to file: {log_file}")
logger.info(f"Logging initialized at {log_level} level")
def get_logger(name: str):
"""
Get a logger instance for a specific module.
Args:
name: Module name
Returns:
Logger instance
"""
return logger.bind(name=name)