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