如何用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")
修改要点
- 用**元组
(sid, message)**替代Match对象作为去重判断依据,元组内容相同则视为重复,解决了原代码对象判断失效的问题。 - 改用嵌套
with语句管理文件,更安全简洁,避免手动关闭文件的遗漏。 - 仅当条目未在集合中时才写入文件,从根源避免重复输出。
- 使用f-string格式化输出,代码可读性更强。
内容的提问来源于stack exchange,提问作者tryin2code
相关产品推荐
相关产品推荐

