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