# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName:   test60
# FileName:      __init__.py
# Author:       lao_zhao
# Datetime:     2024/5/20 15:40
# Description:
# 
# ---------------------------------------------------------------------------
import functools
import logging
import os
import time

log_dir_path = os.path.join(os.path.join(os.path.dirname(__file__), "report"), "log")
if not os.path.exists(log_dir_path):
    # makedirs(c:\c\d\a)  os.mkdir
    os.makedirs(log_dir_path)

log_file_name = os.path.join(log_dir_path, time.strftime("%Y_%m_%d_%H_%M_%S") + ".log")


def log():
    # 创建logger对象
    logger = logging.getLogger()
    # 设置日志的级别
    logger.level = logging.ERROR
    # 设置日志文件
    handler = logging.FileHandler(log_file_name, mode="a", encoding="utf-8")
    # 设置日志的格式
    formatter = logging.Formatter('%(asctime)s - %(levelname)s: %(message)s')
    # 将格式添加到handler中
    handler.setFormatter(formatter)
    # 将handler添加到logger对象中
    logger.addHandler(handler)
    return logger


log = log()


def log_decorator(func_name):
    @functools.wraps(func_name)
    def inner(*args, **kwargs):
        try:
            # 写入info级别的日志
            """
            __init__(): 构造方法，初始化对象
            __new__(): 为对象分配内存空间
            __del__(): 析构方法，回收对象
            __enter__()/__exit__(): 实现上下文管理器
            
            __mro__: 查看继承顺序
            __file__: 获取文件的路径
            __name__: 获取功能/类/方法/模块的名称
            __iter__(): 创建迭代器
            __next__(): 迭代器和生成器取值
            
            __code__: 获取功能的code属性
                    func.__code__.co_filename: 获取func所在的py文件名称
                    func.__code__.co_firstlineno： 获取func所在的py文件中行号
            __doc__：获取功能的描述
            """
            log.info(f"执行的功能为：{func_name.__name__}, 功能的描述为：{func_name.__doc__}, 所在的文件为："
                     f"{func_name.__code__.co_filename}, 所在行为:{func_name.__code__.co_firstlineno}")
            # 执行功能
            return func_name(*args, **kwargs)
        except Exception as e:
            # 如果发生错误，写入一个错误的日志
            log.error(f"执行的功能为：{func_name.__name__}, 功能的描述为：{func_name.__doc__}, 所在的文件为："
                     f"{func_name.__code__.co_filename}, 所在行为:{func_name.__code__.co_firstlineno}, 错误为:{e}")
            raise e
    return inner
