You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Logstash输出JSON到文件时多余字段删除失效问题咨询

配置问题排查

你的配置删字段不生效、输出不符合预期,是3个核心错误导致的:

  • remove_field语法写错:删除字段时直接填字段名即可,不需要加%{}占位符。你写的%{@version}这类格式,Logstash会解析为「删除名称等于@version字段值的字段」,完全匹配不到你要删的元字段,自然删不掉。
  • 过滤逻辑顺序颠倒:你把_grokparsefailure的丢弃判断写在了grok匹配之前,而_grokparsefailure标签是grok匹配失败才会生成的,执行判断时标签还不存在,解析失败的脏数据根本不会被丢弃。
  • 字段清理不彻底+输出格式不规范:你只列了5个要删除的字段,但file输入、grok匹配还会生成message、path、host、tags等默认字段,就算删字段写法正确也会残留;同时手写拼接JSON的方式没有做特殊字符转义,一旦日志内容包含引号、换行,输出的就是非法JSON。
修正方案

推荐用prune过滤器做字段白名单,只保留你需要的3个字段,不用逐个列要删除的字段,避免漏删;输出调整顺序保证逻辑生效,调整后的完整配置如下:

input {
  file {
    path => "/path/to/log"
    type => "tomcat"
    start_position => "beginning"
    
    codec => multiline {
      pattern => "^P50\s+:\s+[0-9]{4}-[0-9]{2}-[0-9]{1,2}\s+[0-9]{1,2}:[0-9]{2}:[0-9]{2}"
      negate => true
      what => "previous"
    }
  }
}


filter {
  # 先执行grok匹配生成字段和标签
  grok {
     match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:details}" }
  }
  # 标签生成后再判断丢弃解析失败的日志
  if "_grokparsefailure" in [tags] {
      drop { }
  }
  # 白名单模式仅保留需要的3个字段,其余所有字段自动清除
  prune {
    whitelist_names => ["timestamp", "level", "details"]
  }
}

output {
   file {
      path => "/out.log"
      file_mode => 0644
      # 按要求输出每行带逗号的JSON格式
      codec => line {
        format => '{"timestamp": "%{timestamp}", "level": "%{level}", "details": "%{details}"},'
      }
   }
}

补充说明:如果你的details字段内容包含双引号、换行符这类特殊字符,上面手写拼接的方式会出现JSON格式错误,这种情况建议在filter层提前用json_encode过滤器对字段做转义,或者直接去掉行尾逗号的非标准要求,改用codec => json_lines输出标准JSON行格式,稳定性更高。

内容的提问来源于stack exchange,提问作者user2175783

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:42:06