我有一个使用线程编写的脚本,我正在将其迁移到多处理。与此同时,我必须改变日志记录的工作方式。我试图做一个快速测试与QueueHandlers,以确保它的工作原理与线程,但我有一个问题与信息和调试消息出现在屏幕上和文件中。
期望的行为是让调试消息只写入文件,而信息消息同时写入屏幕和文件。当我运行以下代码时,它将两条消息写入两个位置。知道为什么会这样吗?
from logging.handlers import QueueListener, QueueHandler
import logging
import os
import multiprocessing
import sys
def main():
queue = multiprocessing.Queue(-1)
formatter = "%(asctime)s - [%(levelname)s] - %(name)s - (%(filename)s).%(funcName)s(%(lineno)d) - %(message)s"
file_handler = logging.FileHandler("b.log")
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(logging.Formatter(formatter))
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(logging.Formatter(formatter))
queue_listener = QueueListener(queue, file_handler, console_handler)
queue_listener.start()
main_logger = logging.getLogger(__name__)
main_logger.addHandler(QueueHandler(queue))
main_logger.setLevel(logging.DEBUG)
main_logger.info("info - log to console and disk")
main_logger.debug("debug - log to disk only")
queue_listener.stop()
这是我在屏幕上看到的…这两个消息也出现在文件中。
2021-08-05 11:26:11,330 - [INFO] - __main__ - (mp_logging.py).main(32) - info - log to console and disk
2021-08-05 11:26:11,330 - [DEBUG] - __main__ - (mp_logging.py).main(33) - debug - log to disk only
算出来了....需要在QueueListener中添加respect_handler_level=True
queue_listener = QueueListener(
logger_queue,
file_handler,
console_handler,
respect_handler_level=True
)