You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:pytest无法捕获multiprocessing子进程日志的解决方法

pytest捕获multiprocessing子进程日志的解决方案

multiprocessing创建的子进程会独立初始化logging模块,主进程中pytest的caplog handler不会被子进程继承,因此子进程生成的日志无法被caplog捕获。--log-cli-level=DEBUG能看到日志是因为此时root logger配置了控制台输出handler,子进程日志直接输出到终端,但不会进入caplog的收集链路。

方案一:使用QueueHandler+QueueListener跨进程转发日志

通过日志队列实现子进程到主进程的日志传输,让caplog能正常收集子进程日志:

import logging
from multiprocessing import Process, Queue
from logging.handlers import QueueHandler, QueueListener

def _bar(log_queue):
    # 子进程配置QueueHandler,将日志发送到队列
    handler = QueueHandler(log_queue)
    root_logger = logging.getLogger()
    root_logger.addHandler(handler)
    root_logger.setLevel(logging.WARNING)
    logging.error("bar")

def test_bar(caplog):
    with caplog.at_level(logging.WARNING):
        log_queue = Queue()
        # 启动QueueListener,将队列中的日志转发给caplog的handler
        listener = QueueListener(log_queue, *caplog.handlers)
        listener.start()
        try:
            p = Process(target=_bar, args=(log_queue,))
            p.start()
            p.join()
            assert "bar" in caplog.messages
        finally:
            listener.stop()

原理说明:

  1. 主进程创建日志队列,启动QueueListener监听队列,将队列中的日志转发给caplog已有的handler。
  2. 子进程初始化QueueHandler,将日志发送到共享队列中。
  3. 主进程的QueueListener将队列日志导入caplog的收集流程,实现跨进程日志捕获。

方案二:通过capfd捕获子进程控制台日志

如果不需要通过caplog断言,可直接捕获子进程的stderr输出(logging默认输出到stderr):

import logging
from multiprocessing import Process
import sys

def _bar():
    # 子进程配置StreamHandler,将日志输出到stderr
    handler = logging.StreamHandler(sys.stderr)
    root_logger = logging.getLogger()
    root_logger.addHandler(handler)
    root_logger.setLevel(logging.WARNING)
    logging.error("bar")

def test_bar(capfd):
    p = Process(target=_bar)
    p.start()
    p.join()
    # 读取捕获的stderr内容
    captured_err = capfd.readouterr().err
    assert "bar" in captured_err

内容的提问来源于stack exchange,提问作者Baumkuchen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:13:31