我在从一个简单的 Java 应用程序向我的 logstash 实例发送日志数据时遇到了一些问题。对于我的用例,我试图避免使用 log4j logback,而是通过原始 tcp 套接字在单独的行上批处理 json 事件。这样做的原因是我希望通过 aws lambda 函数将数据发送到 logstash,这意味着将日志存储到磁盘可能无法解决问题。
我的 logstash 配置文件如下所示:
input {
tcp {
port => 5400
codec => json
}
}
filter{
json{
source => "message"
}
}
output {
elasticsearch {
host => "localhost"
protocol => "http"
index => "someIndex"
}
}
我现在的 java 代码只是打开一个到 logstash 服务器的 tcp 套接字并直接发送一个事件。
Socket socket = new Socket("logstash-hostname", 5400);
DataOutputStream os = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
os.writeBytes("{\"message\": {\"someField\":\"someValue\"} }");
os.flush();
socket.close();
应用程序正确连接到 logstash 主机(如果 logstash 未启动,连接时会抛出异常),但我们的 ES 集群中没有显示任何事件。非常感谢有关如何执行此操作的任何想法!
我在 logstash.err、logstash.log 或 logstash.stdout 中没有看到任何指向可能出错的相关日志。
最佳答案
问题是您的数据已经在您的输入中被反序列化,您正在尝试在您的过滤器中再次反序列化它。只需删除 json 过滤器。
以下是我如何重新创建您的场景:
# the json input
root@monitoring:~# cat tmp.json
{"message":{"someField":"someValue"}}
# the logstash configuration file
root@monitoring:~# cat /etc/logstash/conf.d/test.conf
input {
tcp {
port => 5400
codec => json
}
}
filter{
}
output {
stdout {
codec => rubydebug
}
}
# starting the logstash server
/opt/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf
# sending the json to logstash with netcat
nc localhost 5400 < tmp.json
# the logstash output via stdout
{
"message" => {
"someField" => "someValue"
},
"@version" => "1",
"@timestamp" => "2016-02-02T13:31:18.703Z",
"host" => "0:0:0:0:0:0:0:1",
"port" => 56812
}
希望对你有帮助
关于java - 通过tcp向logstash发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35143576/