如何将java应用程序登录到logstash?

时间:2017-09-05 12:22:29

标签: elasticsearch logstash

我想将数据从java应用程序发送到logstash。 将它发送到“curl”是好的,但它不会将其发送到“java restTemplate”

“curl”示例:确定

$ curl -XPOST -H "Content-Type: application/x-ndjson" "http://10.97.8.151:18080" --data-binary @data.txt

data.txt

{"index":{"_index": "myIndex","_type":"myType"}}
{"data1":"value1","data2":"value2","data3":"value3"}

这很有效。但是,“Java restTemplate”无法正常工作。

其他一切都是相同的,数据形式也不同。

{"index":{"_index": "myIndex","_type":"myType"}}\n{"data1":"value1","data2":"value2","data3":"value3"}

我试图以“application / x-ndjson”的形式描述数据类型,我不知道它出错了。

如何在“java应用程序”中将数据从“java应用程序”传输到“logstash”?

“logstash config”文件如下:

input {
 http {
    host => "0.0.0.0"
    port => "12345"
    codec => es_bulk {
    }
  }
}
output {
  elasticsearch {
       hosts => "x.x.x.x:yyyy"
       index => "{[@metadata][_index]}"
       document_type => "{[@metadata][_type]}"
       template_name => "api"
  }
  stdout { codec => rubydebug { metadata => true } }
}

寻求帮助。

1 个答案:

答案 0 :(得分:0)

执行此操作的最佳方法是不要在es_bulk输入中使用http编解码器,而只是让您的事件成为纯文本消息。

然后,您可以使用elasticsearch输出,而不是使用http输出:

input {
 http {
    host => "0.0.0.0"
    port => "12345"
    codec => "plain"
  }
}
output {
    http {
        http_method => "post"
        url => "http://x.x.x.x:yyyy/_bulk"
        format => "message"
        message => "%{message}"
    }
}

这种方法的一大优点是你的Logstash管道不必解析"批量"输入只是为了重新创建相同的"批量"输出。在这种情况下,您只需使用Logstash作为"传递"。但是,我没有看到它的价值,您可以让Java应用程序将批量有效负载直接发送给ES。