问题描述:
用类实现了一个需求,每次实例化时,会根据传入的参数,在不同的日志文件中写入日志,即要求类的每个实例根据传参写入不同的日志文件。
运行后发现 ,运行到根据c2配置的实例 时,c2实例的日志出现在了c1的日志文件中,控制台日志也是重复的,即使把实例 del 删除也还是会打印重复日志。
主要代码如下:
class KKK
def __init__(self, log_name, base_path)
self.log_name= log_name
self.base_path = base_path
def start():
....
pass
def getLogger(self):
# logger = logging.getLogger('%s_%d' % (self.log_name, int(time.time())))
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s|%(lineno)04d|%(levelname)-8s|%(message)s")
# 控制台日志
StreamHandler = logging.StreamHandler()
StreamHandler.setFormatter(formatter)
StreamHandler.setLevel(logging.INFO)
# 较详细的日志
FileHandler = logging.FileHandler(filename=os.path.join(self.base_path, '%s.log' % self.log_name), mode='a', encoding='utf8')
FileHandler.setFormatter(formatter)
FileHandler.setLevel(logging.DEBUG)
logger.addHandler(StreamHandler)
logger.addHandler(FileHandler)
return logger
if __name__ == '__main__':
c1 = {...}
c2 = {...}
for cc in [c1, c2]:
kkk = KKK(**cc)
kkk.start()
问题原因
logging.getLogger( ), 并未传递参数, 所以得到的self.logger是RootLogger。RootLogger是一个python程序内全局唯一的,所有Logger对象的父类,对RootLogger的设定,均会影响到后续的日志。
解决办法
方法1
getLogger设置参数
logger = logging.getLogger('%s_%d' % (self.course_name, int(time.time())))
方法2
类实例销毁前清空log.handlers
def __del__(self):
self.stopLogger()
pass
def stopLogger(self):
# for fh in self.logger.handlers:
# print(fh.get_name, '+++++')
# if isinstance(fh, logging.FileHandler):
# print('close handler')
# fh.close()
self.logger.warning('关闭日志, %s , %s' % (self.course_name, self.logger.name))
self.logger.handlers.clear()
pass
参考
https://blog.csdn.net/weixin_42503009/article/details/116171149
https://blog.csdn.net/weixin_43997319/article/details/123990742