Logstash解析ModSecurity审计日志时嵌套JSON无法正确拆分字段
从你提供的Elasticsearch查询结果来看,当前Logstash的JSON解析逻辑已经正常生效,原始日志内容已经被结构化存储到transaction字段下,你感知到的解析异常通常是字段冗余、层级不符合使用习惯、时间戳不准确这类问题,可通过补充filter配置优化:
优化后的Logstash配置
filter段参考
filter { json { source => "message" skip_on_invalid_json => "true" tag_on_failure => ["_jsonparsefailure"] # 无需保留原始日志字符串可开启此行删除冗余字段 remove_field => ["message"] } # 校正时间为日志实际生成时间,替换默认的Logstash采集时间 date { match => ["[transaction][time_stamp]", "EEE MMM dd HH:mm:ss yyyy"] timezone => "Asia/Shanghai" # 请替换为你服务器实际使用的时区 target => "@timestamp" } # 可选:将transaction下的所有字段提取到根层级,无需层级嵌套可开启 ruby { code => ' event.get("transaction")&.each do |key, value| event.set(key, value) end event.remove("transaction") ' } # 可选:字段类型转换,适配后续查询统计需求 mutate { convert => { "[transaction][host_port]" => "integer" "[transaction][client_port]" => "integer" "[transaction][request][http_version]" => "float" "[transaction][response][http_code]" => "integer" } } # 可选:解析失败的日志处理逻辑,可选择丢弃或者保留排查 if "_jsonparsefailure" in [tags] { # drop {} # 无需保留解析失败的日志可开启此行 } }
配置说明
- 冗余字段清理:
remove_field => ["message"]会删除原始的JSON字符串字段,避免重复存储占用磁盘,有原始日志留存需求可删除该行配置。 - 时间校正:默认
@timestamp是Logstash读取到日志的时间,通过date过滤器替换为ModSecurity记录的真实请求时间,符合日志查询的常规使用场景,注意时区参数要和你的服务器时区匹配,否则会出现时间偏移。 - 字段层级扁平化:ruby段会将原本嵌套在
transaction下的client_ip、request、response等字段提取到根层级,在Kibana查询时无需额外加transaction.前缀,习惯保留层级结构可删除该段配置。 - 类型转换:将端口、状态码等字段转为数值类型,方便后续做范围查询、聚合统计,比如统计不同状态码的请求占比、筛选指定端口的访问日志。IP字段的类型转换更建议在Elasticsearch的索引模板中设置为
ip类型,适配IP段查询需求。
内容的提问来源于stack exchange,提问作者Blason R
相关产品推荐
相关产品推荐

