python写入日志文件时日志内容重复写入

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

猜你喜欢

转载自www.cnblogs.com/gxfaxe/p/10858164.html