Python logging 的错误使用导致重复记录日志

Python logging 的错误使用导致重复记录日志

错误的表现: 重复记录日志,并且重复记录的字数递增。

例如:


Class BaseClass(object):

    def __init__(self, *args, **kwargs):
        # some init 
        self._set_api_logger()

    def _set_http_logger(self):
        cls_name = self.__class__.__name__
        log_path = "./logs"
        if not os.path.exists(log_path):
            os.mkdir(log_path)
        log_fn = "{0}/{1}.log".format(log_path, cls_name)
        # 这里的getLogger
        self.http_logger = logging.getLogger(cls_name)
        self.http_logger.setLevel(logging.DEBUG)
        file_log_format = """[%(asctime)s][%(levelname)s][%(name)s][line:%(lineno)d][%(message)s]"""
        formtter = logging.Formatter(file_log_format)
        file_handle = TimedRotatingFileHandler(log_fn, "midnight")
        file_handle.setFormatter(formtter)
        # 错误的原因就在这里。只要主进程没有退出,
        # 每次初始化的时候,就会对 self.http_logger 添加一个新的 handle 。导致每次初始化都会增加一条日志记录。
        self.http_logger.addHandler(file_handle)
        # 解决方案:
        # if not self.http_logger.handlers:
        #      self.http_logger.addHandler(file_handle)
        # 当self._set_http_logger 为空的时候,再去添加 handle
    
    def http_api(self, url, args, headers):
        self.http_logger.debug(url)

Python logging 模块的 getLogger 函数的注释是说明是这样的

getLogger(name=None)
    Return a logger with the specified name, creating it if necessary.
    
    If no name is specified, return the root logger.

getLogger 首先查找指定的logger是否存在,如果存在即返回该logger,否则新创建一个。

上面代码中的 class 在每次初始化的时候,都会去 getLogger,如果初始化的是类名相同(不论初始化数值是否一样),都会增加一个 file_handle。 就会导致日志重复记录的问题。

posted on 2017-03-06 21:52  董小卓  阅读(305)  评论(0编辑  收藏  举报

导航