| | import logging |
| | import sys |
| | import time |
| | from functools import wraps |
| | from typing import Callable, Any |
| | from rich.logging import RichHandler |
| | from rich.console import Console |
| |
|
| | console = Console() |
| |
|
| | def setup_logger(name: str, level: str = "INFO") -> logging.Logger: |
| | """ |
| | Configure and return a Rich-formatted logger with enhanced debugging capabilities |
| | |
| | Args: |
| | name: Logger identifier, typically module name |
| | level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL) |
| | |
| | Returns: |
| | Configured logger instance with rich formatting and error tracing |
| | """ |
| | logging.basicConfig( |
| | level=level, |
| | format="%(asctime)s [%(name)s] %(levelname)s: %(message)s", |
| | datefmt="[%X]", |
| | handlers=[ |
| | RichHandler(rich_tracebacks=True, markup=True), |
| | logging.StreamHandler(sys.stdout) |
| | ] |
| | ) |
| | |
| | logger = logging.getLogger(name) |
| | logger.setLevel(level) |
| | return logger |
| |
|
| | def log_execution_time(logger: logging.Logger) -> Callable: |
| | """Decorator to log function execution time""" |
| | def decorator(func: Callable) -> Callable: |
| | @wraps(func) |
| | def wrapper(*args: Any, **kwargs: Any) -> Any: |
| | start_time = time.time() |
| | logger.debug(f"Starting {func.__name__} with args: {args}, kwargs: {kwargs}") |
| | |
| | try: |
| | result = func(*args, **kwargs) |
| | execution_time = time.time() - start_time |
| | logger.debug(f"Completed {func.__name__} in {execution_time:.2f} seconds") |
| | return result |
| | except Exception as e: |
| | logger.error(f"Error in {func.__name__}: {str(e)}", exc_info=True) |
| | raise |
| | return wrapper |
| | return decorator |
| |
|
| | def log_async_execution_time(logger: logging.Logger) -> Callable: |
| | """Decorator to log async function execution time""" |
| | def decorator(func: Callable) -> Callable: |
| | @wraps(func) |
| | async def wrapper(*args: Any, **kwargs: Any) -> Any: |
| | start_time = time.time() |
| | logger.debug(f"Starting async {func.__name__} with args: {args}, kwargs: {kwargs}") |
| | |
| | try: |
| | result = await func(*args, **kwargs) |
| | execution_time = time.time() - start_time |
| | logger.debug(f"Completed async {func.__name__} in {execution_time:.2f} seconds") |
| | return result |
| | except Exception as e: |
| | logger.error(f"Error in async {func.__name__}: {str(e)}", exc_info=True) |
| | raise |
| | return wrapper |
| | return decorator |
| |
|