import functools import logging logging.basicConfig(level=logging.INFO, format="%(asctime)s — %(message)s") logger = logging.getLogger(__name__) def log_step(func): @functools.wraps(func) def wrapper(*args, **kwargs): logger.info(f"START {func.__name__}") try: result = func(*args, **kwargs) logger.info(f"END {func.__name__} — OK") return result except Exception as e: logger.error(f"FAIL {func.__name__} — {type(e).__name__}: {e}") raise return wrapper