発生した事象
複数のhandlerでそれぞれのレベルを設定しているわけだが、実行速度を重視するためにQueueListenerの適用を考えたため、以下のような構成に変更した。すると、handlerに設定されているログレベルが適用されず、すべてのhandlerがDEBUGになってしまった。
log_queue = queue.Queue()
queue_handler = logging.handlers.QueueHandler(log_queue)
logger = logging.getLogger("my_app")
logger.setLevel(logging.DEBUG)
logger.addHandler(queue_handler)
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(logging.Formatter("[CONSOLE] %(levelname)s: %(message)s"))
error_handler = logging.FileHandler("error.log", encoding="utf-8")
error_handler.setLevel(logging.ERROR)
error_handler.setFormatter(logging.Formatter("[ERROR] %(levelname)s: %(message)s"))
listener = logging.handlers.QueueListener(log_queue, console_handler, error_handler)
listener.start()
logger.debug("This is DEBUG")
logger.info("This is INFO")
logger.error("This is ERROR")
listener.stop()
解決策
QueueListenerのrespect_handler_levelをTrueにするだけだった。デフォルトでFalseなのはやめて...、handler側のログレベルをリスペクトしてくれぇぇぇというのが率直な感想である。
listener = logging.handlers.QueueListener(log_queue, console_handler, error_handler,respect_handler_level=True)