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')

  

posted @ 2022-02-15 15:12  Yuan_x  阅读(237)  评论(0编辑  收藏  举报