如何使用带字段的Logstash拆分

时间:2018-08-21 14:21:05

标签: elasticsearch logstash kibana

我在文件data.json中存储了以下数据:

{"result":[{"number":"1"},{"number":"2"}]}

这是我的logstash conf文件:

input {
   file {
       path => "C:/work/apps/ELK/data.json"
       start_position => "beginning"
       sincedb_path => "/dev/null"
   }
}

filter {
   split {     
       field => "result"
   }
}

output {
   elasticsearch {
       hosts => "localhost:9200"
       index => "so"
       document_type => 1
   }
   stdout { codec => rubydebug }
}

当我使用此配置及其上的数据运行Logstash时,我在Elastic中仅获得一个带有完整文本的条目(请参见下图)。

Result in Kibana without carriage return

例如,当我修改数据以添加新行时:

"result":[
{"number":"1"},
{"number":"2"}]
根据新行,

result仍然被忽略,但是这次我确实有分歧。我在数据库中收到三个消息: Result in Kibana

我尝试了使用原始json文件提出的here解决方案,但再次没有任何解析(就像在第一种情况下一样)。我不明白为什么。

1 个答案:

答案 0 :(得分:1)

由于字段结果不存在,所以拆分过滤器不起作用。要创建它,您需要解析从文件中读取的json,这将创建字段。

要解析json,请在输入中使用json codecjson filter

仅供参考,使用的最终配置:

input {
   file {
      path => "C:/work/apps/ELK/data.json"
      start_position => "beginning"
      sincedb_path => "/dev/null"
   }
}

filter {
    json {
        source => "message"
        remove_field => ["message", "host", "path"]
    }
    split {
        field => "result"
        add_field => {
            "number" => "%{[result][number]}"           
        }
        remove_field => "result"
   }
}

output {
    elasticsearch {
        hosts => "localhost:9200"
        index => "so"
        document_type => 1
    }
    stdout { codec => rubydebug }
}