首页 > 解决方案 > Python 对象实例可以同时具有不同的记录器级别吗?

问题描述

我希望程序中的不同对象具有不同的日志记录级别。那可能吗?

我创建了一个基类,如下所示,其中包含设置日志记录级别的方法。

class Logging():
""" Utility class for common methods."""

logging_levels = ['DEBUG','INFO']#,'WARNING','ERROR'

@property
def verbosity(self):
    return self.__verbosity

@verbosity.setter
def verbosity(self,verbosity):
    """Method to set verbosity of logging on terminal. Different classes may have different levels of verbosity."""

    assert verbosity in self.logging_levels, '{} is not a valid logging level!'.format(verbosity)

    self.__verbosity = verbosity

    #Set logging level - {DEBUG,INFO,WARNING,ERROR}
    if verbosity == 'DEBUG':
        logging.getLogger().setLevel(logging.DEBUG)

    elif verbosity == 'INFO':
        logging.getLogger().setLevel(logging.INFO)

    elif verbosity == 'WARNING':
        logging.getLogger().setLevel(logging.INFO)

    print('{}:Logging level is set to:{}'.format(self.name,verbosity))

    return self.__verbosity

我的另外两个类继承自“Logging”类,我在它们各自的init方法中有以下内容:

self.verbosity = verbosity

但是,我观察到的是,每当使用任一类的实例来设置日志记录级别时,都会全局设置日志记录级别。有没有办法将日志记录级别限制为特定的类实例?

编辑:使用 John Gordon 的建议,我想出了一个解决方案。请看下文。

标签: pythonooplogging

解决方案


if verbosity == 'DEBUG':
    logging.getLogger().setLevel(logging.DEBUG)

elif verbosity == 'INFO':
    logging.getLogger().setLevel(logging.INFO)

elif verbosity == 'WARNING':
    logging.getLogger().setLevel(logging.INFO)

不带名称调用getLogger()会返回根记录器。

因此,所有这些调用都在根记录器上运行,删除任何以前的设置。

解决此问题的一种方法是在调用时提供名称getLogger(),并确保每个类实例的名称不同。


推荐阅读