Python解析日志:按EMSSL分组匹配并对比相关字段方案咨询
Python日志解析与分组对比方案
1. 日志文件解析逻辑
核心思路是按EMSSL条目作为分组标记,将后续所有条目归到最近的EMSSL组下,最终生成以分组ID为键的字典结构,确保每个组内的字段都对应到正确的EMSSL条目。
解析函数代码
import re def parse_log_file(file_path): groups = {} current_group_id = None # 匹配EMSSL分组ID:提取EMSSL-20-后的数字标识 emssl_pattern = re.compile(r'EMSSL-20-(\d+)') with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip().rstrip(';') # 清理换行符和末尾分号 if not line: continue # 跳过空行 key, value = line.split(':', 1) # 按第一个冒号分割键值对 key = key.strip() value = value.strip() # 识别EMSSL条目,初始化新分组 emssl_match = emssl_pattern.search(key) if emssl_match: current_group_id = emssl_match.group(1) groups[current_group_id] = {'EMSSL': (key, value)} elif current_group_id is not None: # 将非EMSSL条目加入当前分组 groups[current_group_id][key] = value return groups
2. 分组对比逻辑
解析完两个文件后,先对比分组的存在性(仅单个文件存在的分组直接报告),再对双方都存在的分组,精准对比组内的EMSUB、ESCN、EMBO字段差异。
对比函数代码
def compare_groups(group_a, group_b, file_a_name="文件A", file_b_name="文件B"): all_group_ids = set(group_a.keys()).union(set(group_b.keys())) for group_id in sorted(all_group_ids): in_a = group_id in group_a in_b = group_id in group_b # 处理仅单个文件存在的分组 if not in_a: print(f"⚠️ 仅{file_b_name}存在分组ID {group_id}") continue if not in_b: print(f"⚠️ 仅{file_a_name}存在分组ID {group_id}") continue # 对比双方都存在的分组内字段 group_a_data = group_a[group_id] group_b_data = group_b[group_id] print(f"\n🔍 对比分组ID {group_id}:") # 筛选需要对比的字段(EMSUB/ESCN/EMBO相关) relevant_keys = set() for key in group_a_data.keys(): if any(prefix in key for prefix in ['EMSUB', 'ESCN', 'EMBO']): relevant_keys.add(key) for key in group_b_data.keys(): if any(prefix in key for prefix in ['EMSUB', 'ESCN', 'EMBO']): relevant_keys.add(key) for key in sorted(relevant_keys): val_a = group_a_data.get(key, '不存在') val_b = group_b_data.get(key, '不存在') if val_a != val_b: print(f" ❌ 字段 {key} 差异: {file_a_name}={val_a}, {file_b_name}={val_b}") else: print(f" ✅ 字段 {key} 一致: {val_a}")
3. 主程序调用
if __name__ == "__main__": # 替换为你的两个日志文件路径 file1 = "log1.txt" file2 = "log2.txt" # 解析两个文件 groups1 = parse_log_file(file1) groups2 = parse_log_file(file2) # 执行对比 compare_groups(groups1, groups2, file1, file2)
关键说明
- 分组准确性:通过正则锁定
EMSSL条目里的数字ID,确保后续所有条目都归到对应分组,不会跨组混淆。 - 对比精准度:仅筛选每个分组内的
EMSUB/ESCN/EMBO字段进行对比,完全匹配需求。 - 扩展性:如果日志格式微调,只需修改正则表达式或字段前缀列表即可快速适配。
内容的提问来源于stack exchange,提问作者aimeekb
相关产品推荐
相关产品推荐

