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

请求解析BGP日志bgplog.log并将内容存储为字典

解析BGP日志为结构化字典的Python实现

这里有个实用的方案来处理你的BGP日志解析需求,我会用Python结合正则表达式来实现,把零散的日志内容转换成清晰的字典结构:

核心思路

你的BGP日志格式非常固定,我们可以用正则精准提取本地主机信息和每个对等体的收发消息统计,再把这些字段组装成易读易用的字典。

完整解析代码

import re
import pprint

def parse_bgplog(log_file_path):
    # 读取日志文件内容
    with open(log_file_path, 'r', encoding='utf-8') as log_file:
        log_content = log_file.read()
    
    # 初始化结果字典
    parsed_data = {
        "local_host": {
            "domain": None,
            "ip": None
        },
        "peers": {}
    }
    
    # 提取本地主机的域名和IP
    local_host_regex = r"主机(.+?) \[(.+?)\]"
    local_match = re.search(local_host_regex, log_content)
    if local_match:
        parsed_data["local_host"]["domain"] = local_match.group(1).strip()
        parsed_data["local_host"]["ip"] = local_match.group(2).strip()
    
    # 提取所有对等体的消息统计记录
    peer_record_regex = r"与BGP对等体(.+?)相连的接口:(.+?)的BGP UPDATE消息数量从'(.+?)'变为'(.+?)'"
    peer_records = re.findall(peer_record_regex, log_content)
    
    # 填充对等体数据到字典
    for peer_ip, msg_direction, old_count, new_count in peer_records:
        peer_ip = peer_ip.strip()
        # 把计数转成整数(方便后续计算)
        old_count = int(old_count)
        new_count = int(new_count)
        
        # 如果对等体还没在字典里,先初始化结构
        if peer_ip not in parsed_data["peers"]:
            parsed_data["peers"][peer_ip] = {
                "received": {"old_count": None, "new_count": None},
                "sent": {"old_count": None, "new_count": None}
            }
        
        # 根据收发方向填充数据
        if msg_direction == "接收":
            parsed_data["peers"][peer_ip]["received"]["old_count"] = old_count
            parsed_data["peers"][peer_ip]["received"]["new_count"] = new_count
        elif msg_direction == "发送":
            parsed_data["peers"][peer_ip]["sent"]["old_count"] = old_count
            parsed_data["peers"][peer_ip]["sent"]["new_count"] = new_count
    
    return parsed_data

# 测试使用(替换成你的日志路径)
if __name__ == "__main__":
    result = parse_bgplog("bgplog.log")
    pprint.pprint(result)

解析结果示例

运行代码后,你会得到这样结构化的字典:

{
    'local_host': {
        'domain': 'local.domain.net',
        'ip': '11.130.55.2'
    },
    'peers': {
        '11.130.44.65': {
            'received': {'old_count': 110376, 'new_count': 110393},
            'sent': {'old_count': 108252, 'new_count': 108348}
        },
        '11.130.44.93': {
            'received': {'old_count': 133736, 'new_count': 134146},
            'sent': {'old_count': None, 'new_count': None}
        }
    }
}

这个结构的优势是可以快速通过对等体IP定位对应的收发统计,后续不管是做数据分析还是存储到数据库都非常方便。只要日志格式保持一致,后续新增的记录也能被自动解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:37:36