我怎样才能知道 getLogger()
返回的是一个新的还是已存在的记录器对象?
我的动机是不想重复地向同一个记录器添加处理程序。
我怎样才能知道 getLogger()
返回的是一个新的还是已存在的记录器对象?
我的动机是不想重复地向同一个记录器添加处理程序。
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 将返回一个命名记录器的单例实例,以便检查
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