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

3

我怎样才能知道 getLogger() 返回的是一个新的还是已存在的记录器对象?

我的动机是不想重复地向同一个记录器添加处理程序。


相关内容:https://dev59.com/41QJ5IYBdhLWcg3wx40V - Tzane
2个回答

3
这似乎没有特别简单的方法...... 不过如果你必须这么做,那么源代码是一个寻找解决方案的好起点。请注意,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)

0

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

所有的处理程序都在logging.conf中定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接