如何使用Python截取fail2ban日志行指定部分隐藏冗余字段
fail2ban日志格式化输出实现方案
核心逻辑:fail2ban的动作日志结构固定,冗余字段集中在时间戳毫秒位到动作关键词之间,用正则提取目标字段即可,不需要硬编码冗余片段做替换,适配性更强。
具体实现代码
import re # 正则捕获组分别提取:秒级时间戳、动作类型(Ban/Found/Unban)、客户端IP # 自动跳过中间所有冗余的毫秒标记、进程名、进程ID、日志级别、jail名称字段 match_rule = re.compile(r'^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}),\d+.*?(Ban|Found|Unban)\s+([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})') with open('/var/log/fail2ban.log', 'r', encoding='utf-8') as f: for line in f: res = match_rule.search(line) if res: log_time, action, client_ip = res.groups() print(f"{log_time} {action} {client_ip}")
方案说明
- 不需要单独写三个if判断关键词,正则匹配本身就会自动过滤掉不含三类动作的无关日志行,也不会误匹配日志内容里碰巧出现Ban/Found/Unban字样的非动作记录
- 没有硬编码冗余片段的空格长度、进程ID等可变内容,哪怕fail2ban升级后中间字段的格式有微调,只要整体日志结构不变就能正常解析
- 逐行遍历文件而非用
readlines()一次性加载全量内容,日志文件体积较大时内存占用更低 - 输出格式完全匹配需求,示例输出:
2022-07-02 18:15:17 Unban 192.168.200.20
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

