1、定义日志的登录
log_lv = {
'info': logging.INFO,
'debug': logging.DEBUG,
'error': logging.ERROR,
'warning': logging.WARNING
}
2、定义日志的主类
class Logger(object):
def __init__(self, level='info'):
# 函数名
# self.func=func
# 获取日志器 用于创建或获取用于发送日志记录消息的Logger对象
self.__logger = logging.getLogger()
# 设置日志级别为INFO
self.__logger.setLevel(log_lv[level])
# 当然的时间年-月-日
current_time = strftime('%Y-%m-%d', localtime(time()))
# 日志的路径名称 y-m-d.log文件
log_name = os.path.join(LOG_PATH, current_time + '.log')
logfile = log_name
# 输出到文件处理器 还包含SteamHandler(输出到控制台)、SocketHandler(输出到网络套接字)
# mode为w 表示覆盖写入 mode为a 表示追加的方式
fh = logging.FileHandler(logfile, mode='w', encoding='utf-8')
# 设置格式化器 时间戳、日志级别、日志名称、消息内容
formatter = logging.Formatter("%(asctime)s - %(filename)s [line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
# 输出到控制台的处理器
sh = logging.StreamHandler()
sh.setFormatter(formatter)
# 添加文件句柄
self.__logger.addHandler(fh)
self.__logger.addHandler(sh)
def get_logger(self):
"""
返回日志器
:return:
"""
return self.__logger
logger = Logger().get_logger()
3、设计日志装饰器
def add_func_log(func):
"""
装饰器
:param func:被装饰的函数
:return:
"""
@wraps(func)
def wrap(*args, **kwargs):
logger.info('执行函数【{}】'.format(func.__name__))
# 执行被装饰的函数
content = func(*args, **kwargs)
logger.info('【{}】函数执行完成'.format(func.__name__))
return content
return wrap # 返回函数