Java 通过tcp向logstash发送数据
我在从一个简单的java应用程序向logstash实例发送日志数据时遇到了一些问题。对于我的用例,我试图避免使用log4j logback,而是通过原始tcp套接字在单独的行上批处理json事件。原因是我希望通过aws lambda函数将数据发送到logstash,这意味着将日志存储到磁盘可能不起作用 我的日志存储配置文件如下所示:Java 通过tcp向logstash发送数据,java,tcp,logstash,logstash-configuration,Java,Tcp,Logstash,Logstash Configuration,我在从一个简单的java应用程序向logstash实例发送日志数据时遇到了一些问题。对于我的用例,我试图避免使用log4j logback,而是通过原始tcp套接字在单独的行上批处理json事件。原因是我希望通过aws lambda函数将数据发送到logstash,这意味着将日志存储到磁盘可能不起作用 我的日志存储配置文件如下所示: input { tcp { port => 5400 codec => json } } filter{ j
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
}
#json输入
root@monitoring:~#cat tmp.json
{“message”:{“someField”:“someValue”}
#日志存储配置文件
root@monitoring:~#cat/etc/logstash/conf.d/test.conf
输入{
tcp{
端口=>5400
编解码器=>json
}
}
滤器{
}
输出{
stdout{
编解码器=>rubydebug
}
}
#启动logstash服务器
/opt/logstash/bin/logstash-f/etc/logstash/conf.d/test.conf
#使用netcat将json发送到logstash
nc localhost 5400{
“someField”=>“someValue”
},
“@version”=>“1”,
“@timestamp”=>“2016-02-02T13:31:18.703Z”,
“主机”=>“0:0:0:0:0:0:0:0:1”,
“端口”=>56812
}
希望有帮助,别忘了在JSON的末尾附加
\n
:
os.writeBytes("{\"bossMessage\": {\"someField\":\"someValue\"} }" + '\n');
我发现在TCP输入节点上使用编解码器时,JSON解析会因未知原因而失败。删除TCP输入上的编解码器并添加过滤器只解决了我的JSON解析问题
input {
tcp {
port => 5400
}
}
filter{
json{
source => "message"
}
}
output {
elasticsearch {
host => "localhost"
protocol => "http"
index => "someIndex"
}
}
另外,我一次写入整个字符串,并且不发送消息中的“\n”,否则Logstash只会得到一条代码为“\r”的空记录
这将在流的末尾追加“\r”。如果将输入定义为json,则不需要运行json过滤器。要查看logstash在做什么,请添加一个“stdout{codec=>rubydebug}”输出节,并查看stdout日志中出现了什么问题。。看来tcp正在被netcat监听。。但是logstash没有接收或正在处理输入?!?
PrintWriter pw = new PrintWriter(os);
pw.println(stringOut);
pw.flush();