Logstash 如何彻底删除 message 字段(含批量与条件删除)?
Logstash 删除 message 字段的完整方案:mutate remove_field 基础用法、prune 插件白名单保留、按条件删除、以及输出层控制。附各方案适用场景对比。
基础答案是 mutate { remove_field => ["message"] };如果需要"只留少数字段、其余全删",用 prune 插件的白名单模式更合适。
基础:mutate remove_field
mutate {
remove_field => ["message", "path", "host"] # 可一次删多个
}
进阶:prune 白名单
只保留指定字段,其余(含 message)全部删除:
prune {
whitelist_names => ["^@timestamp$", "^level$", "^service$", "^trace_id$", "^duration$", "^tags$"]
}
适合字段多且杂、只想保留已知好字段的场景。名称是正则表达式,使用锚点避免误保留;prune 仅处理顶层字段,保留 tags 可留住解析失败标记。
条件删除
if [level] == "DEBUG" {
mutate { remove_field => ["message"] }
}
注意事项
- 删除发生在管道内,后续写入的事件不会携带该字段,但不会删除 ES 中的已有文档或其他副本——删错了没有后悔药,先小流量验证;
- beats 输入自带
message字段,Filebeat 的message与自定义字段并存时确认删的是哪个。
常见问题(FAQ)
Q:prune 和 remove_field 能混用吗? 可以,注意执行顺序(按配置书写顺序)。
Q:删除后 @metadata 还在吗? 普通输出默认不序列化 @metadata,但它仍存在于事件中,也能被显式修改或删除;仅删除 message 不会自动删除 @metadata。