import functools import logging function_call_logger = logging.getLogger("call") # decorator def log_function_call(func): if logging.getLogger().level != logging.DEBUG: return func @functools.wraps(func) def wrapper(*args, **kwargs): function_call_logger.debug( "calling {func}({arguments})".format( func=func.__name__, arguments=", ".join( [str(value) for value in args] + [f"{key}={value}" for key, value in kwargs.items()], ), ), ) return_val = func(*args, **kwargs) function_call_logger.debug(f"{func.__name__}() returned {return_val}") return return_val return wrapper