python 类静态方法实例化另一个类对象的问题?

Logger是使用logging封装的一个日志类, 每次使用的时候都要实例化一下:

logger = Logger().getLogger()
logger.info(' message ')

不想每次实例化, 然后新加了一个类Logg 里面定义了对应各个日志级别的静态方法:
但是测试一下却输出了很多日志, 为什么呢?


import time
from weather.common.libs.logger import Logger


class Logg(object):

    @staticmethod
    def info(message):
        print("info---------------")
        log = Logger().getLogger()
        log.info(message)

if __name__ == '__main__':
    for i in range(3):
        Logg.info('testing..')
        time.sleep(1)
        
输出结果::::
info---------------
[2019-09-18 17:17:58,679][root][INFO]-logg.py-info:line:14    testing..
info---------------
[2019-09-18 17:17:59,679][root][INFO]-logg.py-info:line:14    testing..
[2019-09-18 17:17:59,679][root][INFO]-logg.py-info:line:14    testing..
info---------------
[2019-09-18 17:18:00,681][root][INFO]-logg.py-info:line:14    testing..
[2019-09-18 17:18:00,681][root][INFO]-logg.py-info:line:14    testing..
[2019-09-18 17:18:00,681][root][INFO]-logg.py-info:line:14    testing..        

附加 Logger 类代码:

class Logger(object):
    level_relations = {
        'debug': logging.DEBUG,
        'info': logging.INFO,
        'warning': logging.WARNING,
        'error': logging.ERROR,
        'crit': logging.CRITICAL
    }  # 日志级别关系映射

    def __init__(self, logger=None, level='info'):
        # create logger
        self.logger = logging.getLogger(logger)
        self.logger.setLevel(self.level_relations.get(level))

        # 创建一个handler,用于写入日志文件
        self._log_time = time.strftime("%Y_%m_%d")
        self._log_path = os.path.dirname(os.path.dirname(os.getcwd())) + os.sep + 'log' + os.sep + self._log_time

        # check log file path
        if not os.path.exists(self._log_path):
            os.makedirs(self._log_path)
        self._log_name = self._log_path + os.sep + 'log.log'

        formatter = logging.Formatter('[%(asctime)s][%(name)s][%(levelname)s]-%(filename)s-%(funcName)s:line:%(lineno)d\t%(message)s')

        fh = logging.FileHandler(self._log_name, 'a', encoding='utf-8')
        # fh.setLevel(logging.INFO)
        fh.setFormatter(formatter)

        # 创建一个handler,用于输出到控制台
        ch = logging.StreamHandler()
        # ch.setLevel(logging.INFO)
        ch.setFormatter(formatter)

        # 给logger添加handler
        self.logger.addHandler(fh)
        self.logger.addHandler(ch)

        # 关闭打开的文件
        fh.close()
        ch.close()

    def getLogger(self):
        return self.logger
阅读 2.3k
1 个回答

你的getLogger方法是不是有添加handler的行为?重复get多次会添加多次

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题