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
相关产品推荐
相关产品推荐

