You need to enable JavaScript to run this app. ModSecurity日志解析:批量逐行提取规则时间与ID的方法
优惠活动
大模型
产品
解决方案
定价
更多

ModSecurity日志解析:批量逐行提取规则时间与ID的方法

ModSecurity日志解析实现方案

核心需求

从预先筛选的全量ModSecurity日志条目中,逐行提取两个目标字段,不保留其他冗余信息:

  • 日志记录的时间信息
  • 日志触发的对应规则ID

现有基础与历史问题

  • 已实现的规则ID提取能力:可通过基础awk命令批量定位规则ID,参考实现为awk '{for (I=1;I<NF;I++) if ($I == "[id") print $(I+1)}'
  • 历史尝试的缺陷:此前通过管道串联第二个awk逻辑、逐字段匹配星期缩写提取时间的方案效果不佳
  • 场景约束:日志数据量较大,需逐行全量处理所有条目,不能仅做全局首次匹配导致漏提

问题根因说明

之前的多awk管道方案效果不佳,核心原因是ModSecurity日志的data字段包含大量带空格的自定义内容,会打乱awk默认按空格拆分的字段位置,逐字段匹配星期标识的逻辑很容易因字段偏移定位到错误位置,同时多进程管道的开销对大日志量场景的性能影响较大。

优化实现方案

采用单条awk内置逻辑同时完成两个字段的提取,无额外管道开销,匹配精度不受字段拆分偏移影响:

  1. 时间提取:通过行首正则匹配固定格式的时间片段,覆盖所有常见星期缩写场景,截取时自动去掉时间后冗余的主机名、进程名部分
  2. 规则ID提取:沿用已验证成熟的逐字段匹配逻辑,匹配[id标识位置后取对应的值,自动清理多余的双引号、方括号字符
  3. 逐行独立匹配,无全局状态干扰,完全适配全量日志逐行处理的要求

对应的可直接使用的命令参考:

awk '
{
    # 提取行首的标准时间片段
    log_time = ""
    if (match($0, /^\[(Mon|Tue|Wed|Thu|Fri|Sat|Sun) [A-Za-z]{3} [0-9]{2} [0-9:]{8}/)) {
        log_time = substr($0, RSTART+1, RLENGTH-1)
    }

    # 提取规则ID
    rule_id = ""
    for (i=1; i<=NF; i++) {
        if ($i == "[id") {
            rule_id = $(i+1)
            gsub(/["\]]/, "", rule_id)
            break
        }
    }

    # 双字段匹配成功才输出,过滤无效行
    if (log_time != "" && rule_id != "") {
        print log_time " " rule_id
    }
}
' < 筛选后的modsec日志文件路径

内容的提问来源于stack exchange,提问作者Даня Теран

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 01:06:03