在做接口自动化,使用logging模块打印日志时,遇到一个坑:第一次调用打印一次,第二次调用打印两次,第三次调用打印三次。。。
修改前:
def log(msg): logger = logging.getLogger("App") handler = logging.FileHandler('test.log') logger.setLevel(logging.INFO) #设置日志等级 # 日志输出格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) # 输入到控制台 console = logging.StreamHandler() console.setLevel(logging.INFO) logger.addHandler(handler) logger.addHandler(console) logger.info(msg)
一开始以为是logging.getLogger()多次实例化的问题,于是乎对logging.getLogger()写了一个单例,但是问题仍然没有解决。
原来logging的打印是由handler进行处理的,第一次调用时添加了handler,第二次调用又添加了一个handler,所以,这个logger里有了两个同样的handler,以此类推,调用几次就会有几个handler。。。
解决办法:打印日志后,通过removeHandler()将处理器移除掉。
修改后:
def log(msg): logger = logging.getLogger("App") handler = logging.FileHandler('test.log') logger.setLevel(logging.INFO) #设置日志等级 # 日志输出格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) # 输入到控制台 console = logging.StreamHandler() console.setLevel(logging.INFO) logger.addHandler(handler) logger.addHandler(console) logger.info(msg) #移除处理器 logger.removeHandler(handler) logger.removeHandler(console)