import functools
import logging
import os
import time


def __loger(file_path):
    #获取logger对象
    logger=logging.getLogger()
    #设置日志写入文件中的级别
    logger.level=logging.INFO
    hander=logging.FileHandler(file_path,mode='a',encoding='utf-8')
    #设置文件的写入格式
    formatter=logging.Formatter('时间：%(asctime)s - 日记级别：%(levelname)s, 日志信息：%(message)s')
    #设置日志的文件格式
    hander.setFormatter(formatter)
    #
    logger.addHandler(hander)
    return logger



# print(__file__)
# print(os.path.dirname(__file__))
# print(os.path.join(os.path.dirname(__file__), 'report'))
#获取日志的存放路径
log_dir=os.path.join(os.path.join(os.path.dirname(__file__), 'report'), 'log')
#设置日志文件的名称
log_name='BPMAPItest'+time.strftime("%Y_%m_%d_%H_%M_%S",time.localtime())+"log"
#日志文件路径
log_path=os.path.join(log_dir,log_name)
__log=__loger(log_path)

"""
 __doc__: 获取函数或者方法的描述信息
 __name__: 获取函数或者方法的名称
 __code__: 获取函数或者方法的对象
"""
# 定义日志的装饰器
def log_decorator(param):
    # param使用被装饰对象的名称
    @functools.wraps(param)
    def inner(*args, **kwargs):
        __log.info(
            f"执行的功能为：{param.__name__}, 功能的描述为：{param.__doc__}, 所在的文件为：{param.__code__.co_filename}, 所在的行为：{param.__code__.co_firstlineno}")
        try:
            res = param(*args, **kwargs)
        except Exception as e:
            __log.error(
                f"执行的功能为：{param.__name__}, 功能的描述为：{param.__doc__}, 所在的文件为：{param.__code__.co_filename}, 所在的行为：{param.__code__.co_firstlineno}.报错，错误为：{type(e)}, 错误的描述为：{e}")
            raise e
        else:
            return res
    return inner