Logstash 如何删除 JSON 中的嵌套(深层)字段?
Logstash 删除嵌套字段用 mutate 的 remove_field 配合方括号路径语法:remove_field => ["[user][password]"]。删除整个子对象写父路径即可。本文给出语法与常见错误。
用 remove_field 加方括号路径语法:remove_field => ["[request][headers][authorization]"]——每一层嵌套用一对方括号,逐层定位到要删的字段。
基本语法
filter {
mutate {
remove_field => [
"[user][password]", # 删除嵌套字段
"[request][headers]", # 删除整个子对象
"debug_info" # 顶层字段直接写名
]
}
}
原始日志:
{"user": {"name": "tom", "password": "123456"}, "action": "login"}
处理后 password 消失,其余保留。
先解析再删除
如果日志是字符串形式的 JSON,先用 json filter 解析、删除后如需可再转回:
filter {
json { source => "message" target => "parsed" }
if "_jsonparsefailure" not in [tags] {
mutate { remove_field => ["[parsed][data][token]", "message"] }
} else {
# 失败事件不可携带原始敏感消息进入普通输出;按需使用受控隔离管道
drop { }
}
}
常见错误
- 用点号路径
user.password——错的,点号表示字面字段名,不表示嵌套路径; - 字段层级写错(如实际是
[user][auth][password])——静默不生效,用 stdout 输出调试确认结构。
常见问题(FAQ)
Q:能按模式批量删吗? remove_field 不提供通用通配符匹配;批量场景用 ruby filter 遍历删除。
Q:删字段能减小 ES 存储吗? 可能减少体积,收益取决于字段映射、索引配置、压缩及副本;还要检查原始 message 或其他字段是否留有同一数据。