import time from functools import wraps from typing import Callable def time_logger(logger, app_name: str, **_kwargs) -> Callable: """Decorator to log execution time.""" def get_time_str(date_time) -> str: return time.strftime("%Y:%d:%m %H:%M:%S", time.gmtime(date_time)) extra_data = " | ".join([f"{k} - {v}" for k, v in _kwargs.items()]) def decorator(f): @wraps(f) def wrapper(*args, **kwargs): time_start = time.time() logger.info(f"{app_name} started at {get_time_str(time_start)} {extra_data}") result = f(*args, **kwargs) time_finish = time.time() logger.info( f"{app_name} finished at {get_time_str(time_finish)} {extra_data} " f"| total execution time in sec - {time_finish - time_start}" ) return result return wrapper return decorator