Я играл с пользовательским классом логгера, который я создал для реализации другого «уровня многословия» (который является трассировкой).Я знаю, что это не рекомендуется в соответствии с документацией класса 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).