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

如何在pytest-xdist测试时为每行stdout添加xdist网关编号?

给pytest-xdist日志添加Worker编号的方案

当然可以!要让每条日志都带上对应的xdist worker编号,你只需要通过pytest的配置钩子结合logging的过滤器来实现全局的日志上下文注入,具体步骤如下:

1. 在conftest.py中添加配置代码

在你的测试项目根目录下创建(或修改)conftest.py,加入以下代码:

import logging
import pytest
from pytest_xdist import get_xdist_worker_id

def pytest_configure(config):
    # 自定义日志过滤器,给每条日志记录注入worker_id属性
    class WorkerIDFilter(logging.Filter):
        def filter(self, record):
            # 获取当前worker编号,主进程返回"main"
            record.worker_id = get_xdist_worker_id(config) or "main"
            return True

    # 给所有日志处理器添加这个过滤器
    root_logger = logging.getLogger()
    for handler in root_logger.handlers:
        handler.addFilter(WorkerIDFilter())

    # 修改日志格式,把worker_id加入到输出中
    for handler in root_logger.handlers:
        if isinstance(handler, logging.StreamHandler):
            # 这里可以根据你原来的日志格式调整,只需要加入%(worker_id)s即可
            original_format = handler.formatter._fmt if handler.formatter else "%(levelname)s: %(message)s"
            new_format = f"[%(worker_id)s] {original_format}"
            handler.setFormatter(logging.Formatter(new_format))

2. 效果说明

  • 当你用pytest -n auto(或指定worker数量,比如-n 2)运行测试时,每条stdout日志都会自动带上对应的worker编号,比如:

    [gw0] INFO: 处理用户数据
    [gw1] DEBUG: 连接数据库成功

  • 如果是主进程产生的日志(比如初始化代码),会显示[main]标识。

自定义格式提示

如果你已经有自己的日志格式字符串,只需要在其中插入%(worker_id)s占位符即可,不用完全替换格式。比如原来的格式是%(asctime)s %(levelname)s %(message)s,修改后可以是%(asctime)s [%(worker_id)s] %(levelname)s %(message)s。

这个方案的好处是全局生效,不需要修改任何测试用例里的日志调用代码,所有通过logging模块输出的日志都会自动带上worker标识,完美解决你分不清日志归属的问题!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:49:25