zoukankan      html  css  js  c++  java
  • 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")
  • 相关阅读:
    Web Api:基于RESTful标准
    C#:导入Excel通用类(Xls格式)
    C#:导入Excel通用类(Xlsx格式)
    Selenium---Python3---下拉框选择处理
    Selenium---Python3---弹框处理
    Selenium---设置等待时间
    Selenium---Python3--获取网页url/获取网页title
    Selenium---键盘事件---Python3
    Selenium---鼠标事件---Python3
    Selenium---Python3---常见方法
  • 原文地址:https://www.cnblogs.com/gxfaxe/p/10858164.html
Copyright © 2011-2022 走看看