Python Logging日志重复输出问题

做Scrapy时用logging库重新封了一层Logger类,同时log到日志文件及控制台:

import logging
class Logger(object):
	# 初始化
    def __init__(self):
        # 创建
        self.__logger = logging.getLogger('scrapy')
        # 日志级别
        self.__logger.setLevel(logging.WARNING)
        # 输出日志文件
        file_handler = logging.FileHandler('../../scrapy.log')
        # 输出控制台
        console_handler = logging.StreamHandler()
        # 输出格式
        formatter = logging.Formatter('[%(asctime)s] - %(levelname)s: %(message)s')
        file_handler.setFormatter(formatter)
        console_handler.setFormatter(formatter)
        # 添加handler
        self.__logger.addHandler(file_handler)
        self.__logger.addHandler(console_handler)

	# 获取实例
    def get(self):
        return self.__logger

然后在爬虫和Mysql分别启用了这个logger,在Win7本地启动爬虫只会输出一次:

[2019-08-28 12:03:28,812] - WARNING: 创建数据库连接...

在Linux却同时输出两次:

[2019-08-28 12:03:28,812] - WARNING: 创建数据库连接...
[2019-08-28 12:03:28,812] - WARNING: 创建数据库连接...

正是因为存在这种环境差异,让我根本没想到是init函数的问题
所以我的解决方案是在init里,判断handlers为空:

     ......
     
     # 创建
     self.__logger = logging.getLogger('scrapy')
    
     # 防止重复
     if self.__logger.handlers:
         return
         
     ......

由于我在init指定了logger.name,故每次初始化都会向同一个logger加入handler,造成日志输出重复。
(但是为啥本地不会重复…这还真是个问题)
借此记录一下~

你可能感兴趣的:(Python)