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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM