I'm currently creating a subclass of logging.Logger
, which has a filter based on level, and this level can change between logging calls (hence why I'm doing this with a filter, as opposed to setLevel()
). However, it seems that my logger always prints out messages with level DEBUG
, regardless of the filter. Here's my code below
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')
The code above gives the following output:
testing debug
testing warning
testing critical
testing debug
I know that if I declare SimpleLogger
as a separate variable instead of a subclass, it works, but I need to use the subclass for various reasons. For reference, here is a version not using the subclass that works.
SimpleLogger = logging.getLogger()
SimpleLogger.setLevel(logging.DEBUG)
_handler = logging.StreamHandler()
_handler.setLevel(logging.DEBUG)
SimpleLogger.addHandler(_handler)
SimpleLogger.addFilter(_LevelFilter())
_DEFAULT_LEVEL = 'WARNING'
I cannot figure out for the life of me why the debug messages are always printing. The differences between the subclass and non-subclass versions are not very big, and setting the level should cause debug and info messages to not appear. Any help would be appreciated, thanks!