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")
