如何找出getLogger是否创建了一个新的对象?

问题描述:

如何确定getLogger()是否返回了新的或现有的记录器对象?如何找出getLogger是否创建了一个新的对象?

动机是我不想addHandler重复到同一个记录器。

似乎没有一个特别干净的方法来做到这一点......但是,如果你必须的话,source-code是一个很好的开始寻找的好地方。请注意,logging.getLogger大多是围绕logging.Logger.manager.getLogger的包装。

Manager保留名称映射 - >Logger(或Placeholder)。如果它在由给定的name指定的插槽中有Logger,它将返回它。否则,它会返回一个新的Logger

import logging 
def has_logger(name): 
    manager = logging.Logger.manager 
    if name in manager.loggerDict: 
     return isinstance(manager.loggerDict[name], logging.Logger) 
    else: 
     return False 

注意,这只是处理,你必须命名为记录仪的情况下。如果你做logging.getLogger()(不通过一个名字),那么它只会返回在导入时创建的根记录器(因此它从来不是新的)。

另一种方法可能是获取记录器并检查它是否为handlers列表小于您的预期(即,如果它不是空列表,则添加了处理程序)。

def has_handlers(logger): 
    """Return True if logger has handlers, False otherwise.""" 
    return bool(logger.handlers) 

getLogger将在指定logger返回单一实例,检查

import logging 

id_ = id(logging.getLogger()) 

for i in range(10): 
    assert id_ == id(logging.getLogger()) 

用于记录的目的我使用了一个记录器模块看起来像所用:

mylogger.py

import logging 
import logging.config 

from pathlib import Path 


logging.config.fileConfig(str(Path(__file__).parent/"logging.conf"), 
          disable_existing_loggers=False) 

def get(name="MYLOG", **kw): 

    logger = logging.getLogger(name) 
    logger.propagate = True 
    if kw.get('level'): 
     logger.setLevel(kw.get('level')) 
    else: 
     logger.setLevel(logging.ERROR) 
    return logger 

所有的处理程序都在logging.conf