|
|
""" |
|
|
Logging setup for GEPA Optimizer. |
|
|
|
|
|
This module provides backward-compatible logging functions that delegate |
|
|
to the centralized logging infrastructure. |
|
|
|
|
|
For new code, prefer importing directly from infrastructure.logging: |
|
|
from gepa_optimizer.infrastructure.logging import get_logger, configure_logging |
|
|
""" |
|
|
|
|
|
import logging |
|
|
from pathlib import Path |
|
|
from datetime import datetime |
|
|
from typing import Optional, Union |
|
|
|
|
|
|
|
|
from ..infrastructure.logging import ( |
|
|
get_logger as _get_logger, |
|
|
configure_logging as _configure_logging, |
|
|
LogLevel, |
|
|
) |
|
|
|
|
|
|
|
|
def setup_logging( |
|
|
level: str = "INFO", |
|
|
log_file: Optional[Union[str, bool]] = None, |
|
|
use_colors: bool = True, |
|
|
include_emoji: bool = True, |
|
|
) -> None: |
|
|
""" |
|
|
Configure logging for GEPA Optimizer with optional file logging. |
|
|
|
|
|
This function provides backward compatibility with existing code. |
|
|
New code should use configure_logging() from infrastructure.logging. |
|
|
|
|
|
Args: |
|
|
level: Logging level (e.g. "DEBUG", "INFO", "WARNING") |
|
|
log_file: Path to log file. |
|
|
- None: Auto-generates timestamped filename in logs/ |
|
|
- False: Disables file logging |
|
|
- str: Uses specified path |
|
|
use_colors: Whether to use colored output in console |
|
|
include_emoji: Whether to include emoji in log messages |
|
|
|
|
|
Example: |
|
|
# Basic setup |
|
|
setup_logging(level="INFO") |
|
|
|
|
|
# With file logging |
|
|
setup_logging(level="DEBUG", log_file="optimization.log") |
|
|
|
|
|
# Console only, no colors |
|
|
setup_logging(level="INFO", log_file=False, use_colors=False) |
|
|
""" |
|
|
|
|
|
actual_log_file: Optional[str] = None |
|
|
|
|
|
if log_file is None: |
|
|
|
|
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") |
|
|
log_dir = Path("logs") |
|
|
log_dir.mkdir(exist_ok=True) |
|
|
actual_log_file = str(log_dir / f"optimization_{timestamp}.log") |
|
|
elif log_file is not False: |
|
|
|
|
|
log_path = Path(log_file) |
|
|
log_path.parent.mkdir(parents=True, exist_ok=True) |
|
|
actual_log_file = str(log_file) |
|
|
|
|
|
|
|
|
_configure_logging( |
|
|
level=level, |
|
|
log_file=actual_log_file, |
|
|
use_colors=use_colors, |
|
|
include_emoji=include_emoji, |
|
|
) |
|
|
|
|
|
|
|
|
logger = _get_logger(__name__) |
|
|
if actual_log_file: |
|
|
logger.info(f"Logging to file: {actual_log_file}") |
|
|
logger.info(f"Logging configured at {level} level (console + file)") |
|
|
else: |
|
|
logger.info(f"Logging configured at {level} level (console only)") |
|
|
|
|
|
|
|
|
def get_logger(name: str) -> logging.Logger: |
|
|
""" |
|
|
Get a logger for a specific module. |
|
|
|
|
|
This function provides backward compatibility. New code should use: |
|
|
from gepa_optimizer.infrastructure.logging import get_logger |
|
|
|
|
|
Args: |
|
|
name: Module name (typically __name__) |
|
|
|
|
|
Returns: |
|
|
Configured Logger instance |
|
|
""" |
|
|
return _get_logger(name) |
|
|
|
|
|
|
|
|
|
|
|
__all__ = [ |
|
|
"setup_logging", |
|
|
"get_logger", |
|
|
] |
|
|
|