decorators.py


import logging


def set_logging(name='test'):
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

    # console
    stream_handler = logging.StreamHandler()
    stream_handler.setFormatter(formatter)
    logger.addHandler(stream_handler)

    # file
    file_handler = logging.FileHandler(f'{name}.log')
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)


def print_log(msg):
    if msg:
        logging.debug(msg)
    else:
        logging.debug("--------------------------------------")

def function_tracer(func):
    def wrapper(*args, **kwargs):
        try:
            print_log('')
            print_log(f'{func.__name__} started')
            func(*args, **kwargs)
            print_log(f'{func.__name__} completed')
            print_log('')
        except Exception as e:
            print_log('')
            print_log(f'Error occured in {func.__name__}')
            print_log(e)
            print_log('')
    return wrapper


set_logging()



test.py


from decorators import function_tracer


@function_tracer
def simple():
    print("hello world")


@function_tracer
def simple2():
    printt("hello world")


simple()
simple2()



만들어진 test.log


2021-10-10 17:12:53,793 DEBUG --------------------------------------
2021-10-10 17:12:53,793 DEBUG simple started
2021-10-10 17:12:53,794 DEBUG simple completed
2021-10-10 17:12:53,794 DEBUG --------------------------------------
2021-10-10 17:12:53,794 DEBUG --------------------------------------
2021-10-10 17:12:53,795 DEBUG simple2 started
2021-10-10 17:12:53,795 DEBUG --------------------------------------
2021-10-10 17:12:53,795 DEBUG Error occured in simple2
2021-10-10 17:12:53,795 DEBUG name 'printt' is not defined
2021-10-10 17:12:53,795 DEBUG --------------------------------------