It appears that logging.handlers.QueueHandler
/.QueueListener
is breaking the .setLevel
of an attached logging.FileHandler
in Python 3.12.9 on Windows.
Running the following minimal example results in both INFO and WARNING messages getting into the Test.log
file even though the FileHandler
instance had .setLevel(logging.WARNING)
.
Am I doing something wrong here, or is this a bug?
import logging
import logging.handlers
from multiprocessing import Queue
file_logger = logging.FileHandler('Test.log', encoding='utf-8')
file_logger.setLevel(logging.WARNING)
file_logger.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))
log_queue = Queue()
queue_listener = logging.handlers.QueueListener(log_queue, file_logger)
queue_listener.start()
root_logger = logging.getLogger()
for handler in root_logger.handlers[:]:
root_logger.removeHandler(handler)
queue_handler = logging.handlers.QueueHandler(log_queue)
root_logger.addHandler(queue_handler)
root_logger.setLevel(logging.DEBUG)
logger = logging.getLogger("TestLogger")
logger.info("This is INFO")
logger.warning("This is WARNING")
queue_listener.stop()
logging.shutdown()
Change this line:
queue_listener = logging.handlers.QueueListener(log_queue, file_logger)
to:
queue_listener = logging.handlers.QueueListener(log_queue, file_logger,
respect_handler_level=True)