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

Python如何解析以时间戳为分隔符的跨行日志并输出为JSON格式

问题解决思路

核心逻辑是通过匹配固定格式的时间戳判定新日志的起始位置,而非直接按换行拆分日志:

  • 用正则匹配行开头是否符合YYYY-MM-DD HH:MM:SS.sss的时间戳格式,作为新日志条目的判定依据
  • 维护当前正在拼接的日志对象,非新起始行的内容直接追加到上一条日志的message字段中
  • 处理完全部行后将最后一条日志存入结果,同时调整输出格式和预期对齐
修改后可直接运行的代码
import json
import re

# 匹配日志开头时间戳的正则规则
timestamp_pattern = re.compile(r'^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}')
result = []
current_log = None

with open(r"C:\Users\a1.txt", "r", encoding="utf-8") as f:
    for line in f:
        # 去除行尾换行符
        stripped_line = line.rstrip('\n')
        # 判断是否为新日志的起始行
        if timestamp_pattern.match(stripped_line):
            # 把上一条已处理完的日志存入结果
            if current_log is not None:
                result.append(current_log)
            # 拆分新日志字段,maxsplit=3避免消息内容中的空格导致拆分错误
            parts = stripped_line.split(' ', maxsplit=3)
            current_log = {
                'timestamp': f"{parts[0]} {parts[1]}",
                'severity': parts[2],
                'message': parts[3] if len(parts) > 3 else ''
            }
        else:
            # 跨行内容直接追加到上一条日志的消息字段
            if current_log is not None:
                current_log['message'] += f" {stripped_line}"
# 把最后一条日志加入结果
if current_log is not None:
    result.append(current_log)

# 输出格式和你给出的预期效果完全一致,去掉了JSON数组的首尾方括号
print(json.dumps(result)[1:-1])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:15:08