Python遍历文本事件列表:查找failure后同节点指定PID直到对应finish
Python 事件日志遍历解决方案
输入数据格式
事件日志文本结构如下:
ln pid description 1 23 failure in node 5 2 23 restart node 5 3 26 check node 5 4 30 fault alarm in node 10 5 23 finish .. .. ..
需求目标
- 定位包含指定进程ID(如
23)对应节点(如node 5)的failure事件行 - 从该
failure行的下一行开始遍历,检查是否存在pid=26访问同一节点的记录,且该记录必须出现在同一pid=23的finish事件之前
实现思路与代码
使用enumerate获取行索引,找到目标failure行后,通过while循环从下一行开始遍历,直到遇到目标pid的finish行:
# 示例日志数据(可替换为实际读取的文本行列表) event_log = [ "1 23 failure in node 5", "2 23 restart node 5", "3 26 check node 5", "4 30 fault alarm in node 10", "5 23 finish", "6 23 failure in node 7", "7 26 check node 8", "8 23 finish" ] import re for line_idx, line in enumerate(event_log): # 拆分每行内容,跳过格式异常行 line_parts = line.strip().split() if len(line_parts) < 3: continue current_pid = line_parts[1] description = " ".join(line_parts[2:]) # 匹配目标pid的failure事件 if current_pid == "23" and "failure" in description: # 提取事件对应的节点 node_match = re.search(r'node (\d+)', description) if not node_match: continue target_node = f"node {node_match.group(1)}" target_finish_pid = "23" check_target_pid = "26" match_found = False next_line_idx = line_idx + 1 # 从下一行开始遍历,直到找到finish行或遍历结束 while next_line_idx < len(event_log): current_check_line = event_log[next_line_idx] check_parts = current_check_line.strip().split() if len(check_parts) < 3: next_line_idx += 1 continue check_pid = check_parts[1] check_desc = " ".join(check_parts[2:]) # 先检查是否到达目标pid的finish行,到达则终止遍历 if check_pid == target_finish_pid and "finish" in check_desc: break # 检查是否是指定pid访问目标节点的记录 if check_pid == check_target_pid and target_node in check_desc: match_found = True print(f"匹配成功:{current_check_line}") break next_line_idx += 1 if not match_found: print(f"pid={target_finish_pid}的finish行前,未找到pid={check_target_pid}访问{target_node}的记录")
代码说明
- 通过
enumerate获取行索引,精准定位failure行的位置 - 使用
while循环从failure行的下一行开始遍历,避免重复扫描整个列表 - 遍历过程中优先判断是否遇到目标pid的
finish行,确保只检查有效的区间 - 用正则表达式提取节点信息,提升代码的通用性,无需硬编码节点编号
内容的提问来源于stack exchange,提问作者Adam Barret
相关产品推荐
相关产品推荐

