如何确定getLogger()
是否返回了新的或现有的记录器对象?
我的动机是我不想addHandler
反复使用同一个记录器。
答案 0 :(得分:2)
似乎没有一种特别干净的方法来做到这一点......但是,如果必须的话,source-code是一个非常好的开始寻找的地方,以便弄明白这一点。请注意,logging.getLogger
主要是logging.Logger.manager.getLogger
的包装。
Manager
保留名称的映射 - > Logger
(或Placeholder
)。如果在给定Logger
指定的广告位中有name
,则会返回该广告。否则,它会返回一个新的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)
答案 1 :(得分:0)
getLogger将在指定的记录器上返回一个单例实例,以检查
import logging
id_ = id(logging.getLogger())
for i in range(10):
assert id_ == id(logging.getLogger())
为了记录目的,我习惯使用àlogger模块,如下所示:
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
中定义