Python对象实例可以同时具有不同的记录器级别吗?

时间:2019-05-31 17:56:54

标签: python oop logging

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

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

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

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

编辑: 根据约翰·戈登的建议,我提出了一个解决方案。请参见下面。

2 个答案:

答案 0 :(得分:1)

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()会返回根记录器。

因此,所有这些调用都在root记录器上进行,从而清除了之前的所有设置。

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

答案 1 :(得分:0)

我可以通过对Logger类进行以下更改来解决此问题。

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

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


def initialize_logger(self):
    """Initialize loggers for different classes."""

    self.logger = logging.getLogger(type(self).__name__)

@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':
        self.logger.setLevel(logging.DEBUG)

    elif verbosity == 'INFO':
        self.logger.setLevel(logging.INFO)

    elif verbosity == 'WARNING':
        self.logger.setLevel(logging.WARNING)

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

    return self.__verbosity

我添加了initialize_logger()方法,并在要登录的类的 init 函数中对其进行了调用。

self.initialize_logger()
#Set logging level - {DEBUG,INFO,WARNING,ERROR}
self.verbosity = verbosity

然后,最后,我使用通过logger创建的initialize_logger()对象而不是logging.debug()

self.logger.debug('My log message')

现在我可以分别控制所有类的日志记录级别。