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

Python实时读取多份日志文件,现有代码仅读首个如何实现迭代轮询

实现按顺序循环实时读取多日志文件方案

原有实现的问题

原有代码采用多线程并行处理逻辑,每个线程的follow函数是死循环阻塞读取单个文件,既无法严格保证system.log→wifi.log的读取顺序,也因为阻塞逻辑不会自动切换到下一个文件读取,多线程调度的随机性还会导致输出顺序混乱。

核心改动逻辑

  • 移除多线程并行逻辑,改用单线程轮询机制,严格保证指定的文件读取顺序
  • 修改单文件读取逻辑:每次仅读取文件当前已写入的所有新增行,读完立刻切换到下一个文件,不会阻塞在单个文件上
  • 为每个文件独立维护读取偏移量,避免重复读取历史内容

修改后可运行代码

import time

def read_new_lines(file_obj, last_pos):
    # 移动到上次读取的结束位置
    file_obj.seek(last_pos)
    new_lines = []
    while True:
        line = file_obj.readline()
        if not line:
            break
        new_lines.append(line)
    # 返回新增行和最新的偏移量
    return new_lines, file_obj.tell()

if __name__ == '__main__':
    # 按需要的读取顺序配置文件列表,顺序可自定义调整
    file_paths = ['system.log', 'wifi.log']
    # 存储每个文件的对象和对应读取偏移量
    file_info = []
    # 初始化打开所有文件,初始定位到文件末尾,只读取后续新增内容
    for path in file_paths:
        f = open(path, 'r', encoding='utf-8')
        init_pos = f.seek(0, 2)
        file_info.append({
            "file_obj": f,
            "last_pos": init_pos
        })
    
    try:
        while True:
            # 按列表顺序遍历所有文件
            for info in file_info:
                new_lines, new_pos = read_new_lines(info["file_obj"], info["last_pos"])
                for line in new_lines:
                    print(line.strip())
                # 更新该文件的最新读取偏移量
                info["last_pos"] = new_pos
            # 所有文件遍历完一轮后休眠,降低CPU占用
            time.sleep(0.1)
    finally:
        # 程序退出时统一关闭所有文件句柄
        for info in file_info:
            info["file_obj"].close()

效果说明

运行代码后,新增内容会严格按照system.log→wifi.log的顺序打印,一轮读取完成后会自动回到第一个文件循环检测新增内容,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 19:00:03