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

如何用Python3对Suricata告警日志去重并提取指定内容?

解决Suricata日志去重提取问题

需求说明

我有一个Suricata的alerts.log日志文件,里面大量日志行除时间戳外内容重复,需要提取唯一的告警消息和对应的GID:SID,输出成如下格式:

# SURICATA STREAM excessive retransmissions  
1:2210054

# SURICATA STREAM FIN out of window  
1:2210038

# SURICATA TLS certificate invalid der  
1:2230027

原代码的问题

之前写的代码能生成目标格式但无法去重,用set()也没效果,核心原因是:re.search()返回的是Match对象,哪怕两个匹配结果内容完全一致,它们也是不同的对象,所以用pattern not in unique或者把pattern加入集合,都无法判断内容是否重复。

原代码:

content = open('alerts.log', "r").readlines()
sid_outfile = "test.txt"
unique = []
with open(sid_outfile, "w") as f:
    for line in content:
        pattern = re.search(r"\[(\d:\d+):\d] (.*?) \[", line)
        if pattern not in unique:
            unique.append(pattern)
        if unique:
            f.write("# " + pattern.group(2) + "\n")
            f.write(pattern.group(1) + "\n\n")

修改后的代码

我们需要提取匹配到的实际内容(GID:SID和消息文本),用它们的组合作为去重标识——字符串/元组内容相同时可直接判断重复,且能被集合识别:

import re

# 嵌套with语句,自动管理文件开闭
with open('alerts.log', "r") as log_file, open("test.txt", "w") as out_file:
    unique_entries = set()
    for line in log_file:
        match = re.search(r"\[(\d:\d+):\d] (.*?) \[", line)
        if match:
            sid = match.group(1)
            message = match.group(2)
            # 用元组作为唯一标识,加入集合去重
            entry = (sid, message)
            if entry not in unique_entries:
                unique_entries.add(entry)
                # 按要求格式写入文件
                out_file.write(f"# {message}\n")
                out_file.write(f"{sid}\n\n")

修改要点

  1. 用**元组(sid, message)**替代Match对象作为去重判断依据,元组内容相同则视为重复,解决了原代码对象判断失效的问题。
  2. 改用嵌套with语句管理文件,更安全简洁,避免手动关闭文件的遗漏。
  3. 仅当条目未在集合中时才写入文件,从根源避免重复输出。
  4. 使用f-string格式化输出,代码可读性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:31:12