繁体   English   中英

通过tcp将数据发送到logstash

[英]Sending data to logstash via tcp

我遇到了一些问题,从一个简单的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中看到任何指向可能出错的相关日志。

问题是您的数据已经在输入中反序列化,并且您尝试在过滤器上再次反序列化它。 只需删除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末尾附加\\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”的空记录。

PrintWriter pw = new PrintWriter(os);
pw.println(stringOut);
pw.flush();

这会将“\\ r”附加到流的末尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM