JonyWater 2024-04-18 23:08 采纳率: 0%
浏览 31

pytest多线程运行日志显示错误

pytest框架xdist多线程运行,控制台日志信息无法打印,乱码

pytest框架运行用例,单线程时一切正常,控制台正常输出日志信息,但是开启多线程xdist后,日志信息只能显示一个线程,而通过main()运行,日志信息会乱码。

开启多线程

img

单独运行用例如下图。看到,只有一个线程[gw1]输出了日志信息。

img

main()运行结果如下图。可以看到控制台日志信息乱码,但是日志文件显示正常。

img

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-18 23:08
    关注

    引自免费微信小程序:皆我百晓生

    在处理多线程环境下的日志输出问题时,首先要确认的是日志记录器是否正确配置,确保它能在多线程环境中正常工作,并且不会因为线程同步问题导致日志交错或丢失。在Python中,可以使用logging模块的QueueHandlerThreadSafeFilter来解决这个问题。

    首先,你需要创建一个支持多线程的日志处理器,然后将其添加到你的日志配置中。以下是修改后的日志配置示例:

    import logging
    from queue import Queue
    from logging.handlers import QueueHandler
    
    def setup_logger(name, log_file=None, level=logging.INFO):
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        
        # 创建一个队列
        q = Queue(-1)
        
        # 创建一个处理程序,将日志条目放入队列
        handler = QueueHandler(q)
    
        # 创建一个线程安全的过滤器,确保在多线程环境下正确过滤日志
        thread_safe_filter = logging.Filter()
        handler.addFilter(thread_safe_filter)
    
        # 设置日志级别
        logger = logging.getLogger(name)
        logger.setLevel(level)
    
        # 添加处理程序
        logger.addHandler(handler)
    
        if log_file:
            file_handler = logging.FileHandler(log_file)
            file_handler.setFormatter(formatter)
            logger.addHandler(file_handler)
    
        def process_logs(queue):
            while True:
                record = queue.get()
                if record is None:
                    break
                logger.handle(record)
    
        # 启动一个新的线程来处理队列中的日志
        worker = threading.Thread(target=process_logs, args=(q,))
        worker.setDaemon(True)
        worker.start()
    
        return logger
    
    # 使用方式
    logger = setup_logger('my_logger', 'log_file.log')
    

    接下来,在你的测试代码中,使用这个设置好的日志记录器:

    import pytest
    import logging
    
    logger = logging.getLogger('my_logger')
    
    class TestLogin:
        def test_mall_login(self):
            logger.info("【开始测试】用例-->【账号密码正确】")
            # ... 测试逻辑 ...
            logger.info("响应码断言通过")
            logger.info("响应信息断言通过")
            logger.info("---用例【账号密码正确】测试完成---")
    
    # ... 其他测试类和函数 ...
    
    if __name__ == "__main__":
        import sys
        from _pytest.config import cmdline
    
        # 获取命令行参数
        options, plugins = cmdline.parse(args=sys.argv[1:])
        pytest.main(options=options, plugins=plugins)
    

    这样应该能保证在多线程模式下,日志信息不会丢失或乱序,同时保持控制台和日志文件的输出正常。如果你仍然遇到乱码问题,请检查你的终端编码是否与日志文件的编码一致,确保它们都是UTF-8或者其他兼容的字符集。如果还是有问题,可能需要进一步排查其他潜在的编码问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月18日

悬赏问题

  • ¥15 有可能用平板通过拓展坞来烧录程序吗(keil5的那种)
  • ¥15 网络分析设施点无法识别
  • ¥15 状态图的并发态问题咨询
  • ¥15 PFC3D,plot
  • ¥15 VAE模型编程报错无法解决
  • ¥100 基于SVM的信息粒化时序回归预测,有偿求解!
  • ¥15 物体组批优化问题-数学建模求解答
  • ¥350 麦克风声源定位坐标不准
  • ¥15 apifox与swagger使用
  • ¥15 egg异步请求返回404的问题