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

