如何在Logstash中输入JSON文件(数组形式)?

问题描述 投票:0回答:2

我尝试了很多方法来输入我的 JSON 文件(数组形式),但到目前为止我没有任何结果

input{
    file{
        path=> "/usr/share/logs/Docs.json"


        #codec=> "json" tried
        #codec=> json {charset => "ISO-8859-1"} tried
        #codec => json{ } tried


        start_position=> "beginning"
        sincedb_path=> "/dev/null"
    }
}
filter{
    json{
        source=> "message"
    }
 }
output{
    stdout{
        codec=> "json"
    }
    
    elasticsearch{
        hosts=> ["http://es1:9200"]
        index=> "index_abc"
    }
}

JSON 文件格式(全部在同一行):

[{"id":1,"something":"text1"},{"id":2,"something":"text2"},{"id":3,"something":"text3"}]

如果您可以的话,我将非常感激。

elasticsearch docker-compose logstash
2个回答
0
投票

问题解决了,这是因为编码的原因,我使用了 jq 实用程序将我的 JSON 文件转换为正确的格式(对于 Logstash),即:

{"id":1,"something":"text1"}
{"id":2,"something":"text2"}
{"id":3,"something":"text3"}

我一开始并没有注意到,但是 jq 在转换过程中改变了我的文件的编码,它最终变成了 UTF-16 LE。因此,我使用 VS Code 将编码更改(并保存)为 UTF-8,之后工作正常。

我的更新代码现在可以使用:

input{
    file{
        path=> "/usr/share/logs/Docs_formatted.json"
        codec=> "json"
        start_position=> "beginning"
        sincedb_path=> "/dev/null"
    }
}
filter{}
output{
    stdout{}
    
    elasticsearch{
        hosts=> ["http://es1:9200"]
        index=> "index_abc"
    }
}

对于那些感兴趣的人,我使用此命令行将我的 JSON 文件转换为正确的格式(Windows 命令行):

type Docs.json | jq -c '.[]' > Docs_formatted.json

0
投票
{"DrugId":49,"DrugName":"POLIFLEKS %5 DEKSTROZ %0,2 SODYUM KLORUR SOLUSYON 100 ML SETSIZ"}
{"DrugId":3128,"DrugName":"AMLOVAS 5 MG 20 TABLET","DrugBarcode":8699580010077.0}

首先,json文件中的每条数据必须在一行中。如上所述

input {
  file {
    path => "/Users/your_to_path/Desktop/Results4_Output.json"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    codec => "json"
  }
}

filter {
  json{
    source=>"message"
    remove_field => ["[message]"]
  }
  mutate {
    add_field => { "[@metadata][id]" => "%{BarcodeId}" } --- here is optional
    remove_field => ["message","host", "@version", "@timestamp", "path", "type", "event", "log", "tags"]
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "drugs"
    # document_id => "%{[@metadata][id]}" # --- here is optional
  }
  stdout { codec => rubydebug }
}

我们添加了 mutate 端,使其不会出现在 elasticsearch 端的映射图上。

有关此主题的问题通常是由于与文件格式缺乏一致而引起的。

希望对您有帮助

© www.soinside.com 2019 - 2024. All rights reserved.