我遇到了一些问题,从一个简单的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代码只是打开一个tcp套接字到logstash服务器并直接发送事件。
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中看到任何相关日志,指出可能出现的问题。
答案 0 :(得分:16)
问题是您的数据已在您的输入上反序列化,并且您尝试在过滤器上再次反序列化它。只需删除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
}
希望它有所帮助,
答案 1 :(得分:0)
不要忘记在JSON的末尾添加HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\
:
\n
答案 2 :(得分:0)
我发现,在TCP Input节点上使用编解码器时,JSON解析由于未知原因而失败。删除TCP输入上的编解码器并添加过滤器只能解决我的JSON解析问题。
input {
tcp {
port => 5400
}
}
filter{
json{
source => "message"
}
}
output {
elasticsearch {
host => "localhost"
protocol => "http"
index => "someIndex"
}
}
我还要一次写出整个字符串,并且不要在消息中发送“ \ n”,否则Logstash只会得到代码为“ \ r”的空记录。
PrintWriter pw = new PrintWriter(os);
pw.println(stringOut);
pw.flush();
这会将“ \ r”附加到流的末尾。