如何确定getLogger是否创建了一个新对象?

时间:2016-11-15 15:28:14

标签: python python-2.7 logging

如何确定getLogger()是否返回了新的或现有的记录器对象?

我的动机是我不想addHandler反复使用同一个记录器。

2 个答案:

答案 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

中定义