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。 就会导致日志重复记录的问题。