python日志重复的问题
原因:
handler 生成多次,每次new对象都是个新的,用单例或者判断都可以
代码:
# -*- coding: utf-8 -*- """ @author:yuan_x @software:PyCharm @file:log.py @time:2020/12/17 5:15 下午 """ import time import os from apps.project.tob.hzc.common.dele_file import initialize_log try: from loguru import logger as log_obj except ImportError: import logging as log_obj class Log(): """ 兼容 loguru 可能会出现的版本问题 """ def __new__(cls, *args, **kwargs): ''' :param args: :param kwargs: :return: ''' if not hasattr(cls, '_instance'): initialize_log().initialize_api(path_flag='logs') cls._instance = object.__new__(cls) return cls._instance def __init__(self, *args, **kwargs): self.log_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'logs') self.log_name = os.path.join(self.log_path, '%s.log' % time.strftime('%Y_%m_%d')) if hasattr(log_obj, "add"): self.logger = Log1(log_obj, self.log_name) else: self.logger = Log2(log_obj, self.log_name) def __getattr__(self, item): return getattr(self.logger.logger, item) class Log1(): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = object.__new__(cls) return cls._instance def __init__(self, log_obj, log_name): if not hasattr(self, "logger"): self.logger = log_obj self.logger.add(log_name, format="{time} {level} {message}", filter="", rotation="2 days", level="INFO") # 装饰器 用于追踪错误 self.catch = self.logger.catch class Log2(): def __init__(self, log_obj, log_name): # 文件名 # 日志收集器 日志句柄 self.log_name = log_name self.logger = log_obj.getLogger() if not self.logger.handlers: self.logger.setLevel(log_obj.INFO) self.formatter = log_obj.Formatter('%(asctime)s] - %(filename)s] - %(levelname)s: %(message)s') # 文件 self.fh = log_obj.FileHandler(self.log_name, 'a', encoding='utf-8') self.fh.setLevel(log_obj.INFO) self.fh.setFormatter(self.formatter) self.logger.addHandler(self.fh) # 控制台 self.ch = log_obj.StreamHandler() self.ch.setLevel(log_obj.INFO) self.ch.setFormatter(self.formatter) self.logger.addHandler(self.ch) if __name__ == '__main__': log = Log() log.info('log start') log.info('3333') log.warning('log end') log.debug('log end')