Java 通过tcp向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

我在从一个简单的java应用程序向logstash实例发送日志数据时遇到了一些问题。对于我的用例,我试图避免使用log4j logback,而是通过原始tcp套接字在单独的行上批处理json事件。原因是我希望通过aws lambda函数将数据发送到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
}
#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();