如何找出getLogger是否创建了一个新的对象?
答
似乎没有一个特别干净的方法来做到这一点......但是,如果你必须的话,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