如何基于时间戳合并嵌套表格中的同请求AWS日志行?
合并同时间戳的AWS嵌套日志行
原始日志格式
╭─────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ 0 │ ╭───┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ │ │ │ 0 │ 2023-09-22 17:49:03.301 │ │ │ │ │ 1 │ INFO: 10.0.0.30:49398 - "GET ..." 200 OK │ │ │ │ ╰───┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ │ 1 │ ╭───┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ │ │ │ 0 │ 2023-09-22 17:44:11.024 │ │ │ │ │ 1 │ INFO: 10.0.2.177:15974 - "GET ..." 404 │ │ │ │ ╰───┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ │ 2 │ ╭───┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ │ │ │ 0 │ 2023-09-22 17:44:11.024 │ │ │ │ │ 1 │ INFO: 10.0.0.30:47184 - "GET ..." 500 │ │ │ │ ╰───┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
期望合并效果
╭─────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ 0 │ ╭───┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ │ │ │ 0 │ 2023-09-22 17:49:03.301 │ │ │ │ │ 1 │ INFO: 10.0.0.30:49398 - "GET ..." 200 OK │ │ │ │ ╰───┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ │ 1 │ ╭───┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ │ │ │ 0 │ 2023-09-22 17:44:11.024 │ │ │ │ │ 1 │ INFO: 10.0.2.177:15974 - "GET ..." 404 │ │ | | | | INFO: 10.0.0.30:47184 - "GET ..." 500 │ │ │ │ ╰───┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
实现方案
手动修改效率太低,用Python脚本批量处理最省心,核心逻辑是先按时间戳对日志分组,再重新生成符合格式的嵌套日志。
示例脚本
def merge_aws_logs(raw_log_lines): timestamp_map = {} current_ts = "" # 解析原始日志,提取时间戳和对应日志内容 for line in raw_log_lines: if "│ 0 │" in line: # 提取时间戳 current_ts = line.split("│ 0 │")[1].strip() elif "│ 1 │" in line: # 提取日志内容 log_content = line.split("│ 1 │")[1].strip() if current_ts not in timestamp_map: timestamp_map[current_ts] = [] timestamp_map[current_ts].append(log_content) # 生成合并后的日志内容 merged_lines = [] # 外层表格表头 merged_lines.append("╭─────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮") outer_idx = 0 for ts, logs in timestamp_map.items(): # 外层表格行开头 merged_lines.append(f"│ {outer_idx} │ ╭───┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │") # 写入时间戳行 merged_lines.append(f"│ │ │ 0 │ {ts} │ │") # 写入第一条日志 merged_lines.append(f"│ │ │ 1 │ {logs[0]} │ │") # 写入同时间戳的剩余日志 for log in logs[1:]: merged_lines.append(f"| | | | {log} │ │") # 子表格结尾 merged_lines.append(f"│ │ ╰───┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │") outer_idx += 1 return merged_lines # 执行逻辑 if __name__ == "__main__": # 读取原始日志文件 with open("aws_logs.txt", "r", encoding="utf-8") as f: raw_lines = [line.rstrip("\n") for line in f] # 生成合并日志 merged_logs = merge_aws_logs(raw_lines) # 保存到文件 with open("merged_aws_logs.txt", "w", encoding="utf-8") as f: f.write("\n".join(merged_logs)) # 打印到控制台 print("\n".join(merged_logs))
使用步骤
- 把原始日志保存成
aws_logs.txt,和脚本放在同一目录 - 运行脚本,会自动生成
merged_aws_logs.txt,里面就是按需求合并好的日志 - 脚本会自动识别时间戳相同的日志,把它们合并到同一个子表格的日志行下方,完全匹配你要的格式
内容的提问来源于stack exchange,提问作者Howins
相关产品推荐
相关产品推荐

