调试时发现,每个调用日志类的地方会呈一个趋势,第一个日志写一次,第二个日志写两次,第三个日志写三次…后面也会依次增长。
问题产生原因:调用日志类时,由于getlogger(name)每次的name都是一样的,所以每次都指向原先的logger对象,但每次调用都会添加一个handler,一次调用添加1个,两次调用添加2个…,因此日志的输出也呈这个趋势增长。
最简单使用的解决方法是,在添加handler前先判断当前日志器内是否已存在handler,如果已存在就不添加,如果为空则添加新的handler。
import logging
import logging.handlers
class LogUtils(object):
@classmethod
def log_output_file(cls):
cls.logger_adb = logging.getLogger('adb')
cls.logger_adb.setLevel(logging.DEBUG)
#如果当前日志器里handler已存在就不重复添加,为空再添加,避免日志重复输出
if not cls.logger_adb.handlers:
handler_adb = logging.FileHandler('out.log',encoding='utf-8')
handler_adb.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s[:%(lineno)s] - %(message)s'))
cls.logger_adb.addHandler(handler_adb)
return cls.logger_adb