pythonloggingpython-multiprocessing

QueueListener breaks logging level filter?


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()

Solution

  • 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)
    
    

    See documentation for QueueListener.