通过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 代码现在只是打开一个到 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:

的末尾附加 \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”附加到流的末尾。