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" }
mutate { remove_field => ["[data][token]"] }
}
常见错误
- 用点号路径
user.password——错的,remove_field 只认方括号语法; - 字段层级写错(如实际是
[user][auth][password])——静默不生效,用 stdout 输出调试确认结构。
观测云对照
观测云 DataKit Pipeline 的 drop_key() 函数直接按路径删除字段,嵌套路径写法直观,且可与脱敏函数组合:先 cover() 打码敏感值、再 drop_key() 删冗余字段。
常见问题(FAQ)
Q:能按模式批量删吗? remove_field 支持通配符的场合并不可靠;批量场景用 ruby filter 遍历删除。
Q:删字段能减小 ES 存储吗? 能,且显著提升——大字段(如完整请求体)删除后索引体积明显下降。