Пользовательский Python Class Logger Class: Как заставить его работать в разных классах? - PullRequest
0 голосов
/ 05 мая 2019

Я играл с пользовательским классом логгера, который я создал для реализации другого «уровня многословия» (который является трассировкой).Я знаю, что это не рекомендуется в соответствии с документацией класса logger - однако у меня есть код, который должен иметь его для выполнения обширной отладки.В связи с этим я могу вызвать регистратор со всеми методами (LOG.warning, LOG.trace и т. Д.), Как и ожидалось, но когда я пытаюсь сделать то же самое в другом классе, он не работает, как предполагалось.Я предполагаю, что свойства логгера просто по какой-то причине теряются.

По сути, я хочу добиться того, чтобы свойства, которые я установил изначально (такие как формат журнала, обработчики журнала, уровень журнала и т. Д.), Были сохранены.в каждом классе.

У меня есть класс регистратора, который реализует "TRACE":

from logging import getLoggerClass, addLevelName, setLoggerClass, NOTSET


class AioLogger(getLoggerClass()) :
    TRACE = 1

    def __init__(self, name, level=NOTSET):
        super().__init__(name, level)

    addLevelName(TRACE, "TRACE")

    def trace(self, message, *args, **kwargs):
        if self.isEnabledFor(AioLogger.TRACE):
            self._log(AioLogger.TRACE, message, args, **kwargs)


setLoggerClass(AioLogger)

класс a:

import logging
from AioLogger import AioLogger
from b import b

LOG = AioLogger(logging.getLogger('myapp'))
class a:
    def __init__(self):
        LOG.setLevel(AioLogger.TRACE)

        # create a file handler
        file_handler = logging.FileHandler('test.log')
        file_handler.setLevel(logging.DEBUG)
        file_formatter = logging.Formatter('[%(asctime)s] %(filename)-15s: line %(lineno)-5d: %(levelname)-8s: '
                                           '%(funcName)-50s: %(message)s')
        file_handler.setFormatter(file_formatter)
        LOG.addHandler(file_handler)

        # create console handler
        console_handler = logging.StreamHandler()
        console_handler.setLevel(AioLogger.TRACE)
        console_formatter = logging.Formatter('[%(asctime)s] %(filename)-15s: line %(lineno)-5d: %(levelname)-8s: '
                                              '%(funcName)-50s: %(message)s')
        console_handler.setFormatter(console_formatter)
        LOG.addHandler(console_handler)

        LOG.trace('trace')
        LOG.debug('debug')
        LOG.info('info')
        LOG.warning('warning')
        LOG.error('error')

класс b:

import logging
from AioLogger import AioLogger

LOG = AioLogger(logging.getLogger('myapp'))
class b:
    def __init__(self):
        LOG.trace('trace')
        LOG.debug('debug')
        LOG.info('info')
        LOG.warning('warning')
        LOG.error('error')

Добавляя в конец файла из класса a следующее:

ls = a()
cls2 = b()

и выполняя его, выдает следующий вывод:

[2019-05-05 18:03:19,908] a.py           : line 27   : TRACE   : __init__                                          : trace
[2019-05-05 18:03:19,908] a.py           : line 28   : DEBUG   : __init__                                          : debug
[2019-05-05 18:03:19,908] a.py           : line 29   : INFO    : __init__                                          : info
[2019-05-05 18:03:19,908] a.py           : line 30   : WARNING : __init__                                          : warning
[2019-05-05 18:03:19,908] a.py           : line 31   : ERROR   : __init__                                          : error
warning
error

По некоторым причинам определенные свойствадля пользовательского класса журнала просто исчезают.Я предполагаю, что ошибка находится где-то в моем пользовательском классе логгера, поскольку получение «стандартного» логгера через logging.getlogger ('myapp') просто отлично работает - но он не обеспечивает необходимый уровень логики TRACE (отсюда и собственный класс логгера, который BTWЯ нашел где-то на stackoverflow).

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