В настоящее время я создаю подкласс logging.Logger
, в котором есть фильтр, основанный на уровне, и этот уровень может меняться между журналами вызовов (поэтому я делаю это с фильтром, а не setLevel()
).,Однако, похоже, что мой регистратор всегда печатает сообщения с уровнем DEBUG
, независимо от фильтра.Вот мой код ниже
import logging
class _LevelFilter(logging.Filter):
def filter(self, record):
SimpleLogger.setLevel(_DEFAULT_LEVEL)
return 1 if SimpleLogger.isEnabledFor(record.levelno) else 0
class _SimpleLogger(logging.getLoggerClass()):
def __init__(self, name=None, level=logging.DEBUG):
super().__init__(name, level)
self.setLevel(logging.DEBUG)
_handler = logging.StreamHandler()
_handler.setLevel(logging.DEBUG)
self.addHandler(_handler)
self.addFilter(_LevelFilter())
_DEFAULT_LEVEL = 'WARNING'
SimpleLogger = _SimpleLogger()
if __name__ == '__main__':
SimpleLogger.debug('testing debug')
SimpleLogger.info('testing info')
SimpleLogger.warning('testing warning')
SimpleLogger.critical('testing critical')
SimpleLogger.debug('testing debug')
Код выше дает следующий вывод:
testing debug
testing warning
testing critical
testing debug
Я знаю, что если я объявлю SimpleLogger
как отдельную переменную вместо подкласса, это будет работать, но мне нужно использовать подкласс по разным причинам.Для справки, вот версия, не использующая работающий подкласс.
SimpleLogger = logging.getLogger()
SimpleLogger.setLevel(logging.DEBUG)
_handler = logging.StreamHandler()
_handler.setLevel(logging.DEBUG)
SimpleLogger.addHandler(_handler)
SimpleLogger.addFilter(_LevelFilter())
_DEFAULT_LEVEL = 'WARNING'
Я не могу понять, почему сообщения отладки всегда печатаются.Различия между версиями подкласса и не подкласса не очень велики, и установка уровня должна привести к тому, что отладочные и информационные сообщения не будут появляться.Любая помощь будет оценена, спасибо!