做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,造成日志输出重复。
(但是为啥本地不会重复…这还真是个问题)
借此记录一下~