import logging import time from contextlib import contextmanager from typing import Optional @contextmanager def context_logger(operation_name: str, logger: Optional[logging.Logger] = None): """ Context manager for logging operation timing. Args: operation_name: Name of the operation being performed logger: Logger instance to use. If None, uses root logger. Example: with context_logger("Loading search data", logger): data = load_data() """ if logger is None: logger = logging.getLogger(__name__) start_time = time.time() logger.info(f"Starting {operation_name}...") try: yield elapsed = time.time() - start_time logger.info(f"Completed {operation_name} in {elapsed:.3f}s") except Exception as e: elapsed = time.time() - start_time logger.error(f"Failed {operation_name} after {elapsed:.3f}s: {e}") raise