python写入日志文件时日志内容重复写入:原因handler未移除,导致重复写入
问了度娘之后,大概搞明白了,就是你第二次调用log的时候,根据getLogger(name)里的name获取同一个logger,而这个logger里已经有了第一次你添加的handler,第二次调用又添加了一个handler,所以,这个logger里有了两个同样的handler,以此类推,调用几次就会有几个handler。。
修改前代码:
1 # coding:utf-8 2 import logging 3 from logging import handlers 4 5 6 class Logger(): 7 level_relations = {"debug": logging.DEBUG, "info": logging.INFO, "warning": logging.WARNING, 8 "error": logging.ERROR, "critical": logging.CRITICAL,} 9 fmt_str = "%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s:%(message)s" 10 def __init__(self, filename, level="info", when="D", backCount=2, fmt=fmt_str): 11 self.logger = logging.getLogger(filename) 12 format_str = logging.Formatter(fmt) 13 self.logger.setLevel(self.level_relations.get(level)) 14 self.th = handlers.TimedRotatingFileHandler(filename, when=when, backupCount=backCount, encoding="utf-8") 15 self.th.setFormatter(format_str) 16 17 def log_write(self, log_text, level="info"): 18 self.logger.addHandler(self.th) 19 if level == "debug" or level == "DEBUG": 20 self.logger.debug(log_text) 21 elif level == "info" or level == "INFO": 22 self.logger.info(log_text) 23 elif level == "warning" or level == "WARNING": 24 self.logger.warning(log_text) 25 elif level == "error" or level == "ERROR": 26 self.logger.error(log_text) 27 elif level == "critical" or level == "CRITICAL": 28 self.logger.critical(log_text) 29 else: 30 raise ("日志级别错误") 31 32 33 if __name__ == '__main__': 34 log1 = Logger("text.log") 35 log1.log_write("test4-0") 36 log2 = Logger("text.log") 37 log2.log_write("test4-1") 38 log3 = Logger("text.log") 39 log3.log_write("test4-2")
执行结果:
文件中日志内容打印了多次
修改后的代码:
1 # coding:utf-8 2 import logging 3 from logging import handlers 4 5 6 class Logger(): 7 level_relations = {"debug": logging.DEBUG, "info": logging.INFO, "warning": logging.WARNING, 8 "error": logging.ERROR, "critical": logging.CRITICAL,} 9 fmt_str = "%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s:%(message)s" 10 def __init__(self, filename, log_text, level="info", when="D", backCount=2, fmt=fmt_str): 11 self.logger = logging.getLogger(filename) 12 format_str = logging.Formatter(fmt) 13 self.logger.setLevel(self.level_relations.get(level)) 14 self.th = handlers.TimedRotatingFileHandler(filename, when=when, backupCount=backCount, encoding="utf-8") 15 self.th.setFormatter(format_str) 16 17 def log_write(self, log_text, level="info"): 18 self.logger.addHandler(self.th) 19 if level == "debug" or level == "DEBUG": 20 self.logger.debug(log_text) 21 elif level == "info" or level == "INFO": 22 self.logger.info(log_text) 23 elif level == "warning" or level == "WARNING": 24 self.logger.warning(log_text) 25 elif level == "error" or level == "ERROR": 26 self.logger.error(log_text) 27 elif level == "critical" or level == "CRITICAL": 28 self.logger.critical(log_text) 29 else: 30 raise ("日志级别错误") 31 self.logger.removeHandler(self.th) # 日志写入完成后移除handler 32 33 34 if __name__ == '__main__': 35 log = Logger("text.log", "test4-1") 36 log = Logger("text.log", "test4-2") 37 log = Logger("text.log", "test4-3")