Могут ли экземпляры объектов Python иметь разные уровни ведения журнала одновременно? - PullRequest
0 голосов
/ 31 мая 2019

Я хотел, чтобы разные объекты в моей программе имели разные уровни ведения журнала. Это возможно?

Я создал базовый класс, как показано ниже, содержащий методы для установки уровней ведения журнала.

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 ]

1 голос
/ 31 мая 2019
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() и обеспечения того, что имя отличается для каждого экземпляра класса.

0 голосов
/ 01 июня 2019

Мне удалось решить эту проблему, внеся следующие изменения в мой класс 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')

Теперь я могу контролировать уровень ведения журнала отдельно для всех классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...