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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 13:57:49