Python迭代并通过套接字发送数据(Logstash / Elasticsearch)

时间:2017-05-24 20:54:57

标签: python sockets elasticsearch logstash python-sockets

我正在尝试流式传输JSON数据并将每个单独的JSON事件(由' \ n'分隔)提供到与LogStash(localhost 5000)通信的TCP套接字中。但是,我似乎只能通过LogStash填充Elasticsearch中的最后一个json对象。我可以验证API调用的工作原理,并且应该包含大约70个单独的事件。只有最后一个通过此LogStash入口点在Elasticsearch中结束。我还验证了请求调用中的流和分隔符正在工作并返回单个JSON事件。 iter_lines的每次迭代都将按预期打印单个JSON对象。我想分别通过这个套接字发送每个json对象,但它不起作用。有任何想法吗?我是否需要拆除并为每个json对象构建套接字?

HOST = 'localhost'
PORT = 5000

try:
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
  sys.stderr.write("[ERROR] %s\n" % msg[1])
  sys.exit(1)

try:
  sock.connect((HOST, PORT))
except socket.error, msg:
  sys.stderr.write("[ERROR] %s\n" % msg[1])
  sys.exit(2)

#make web request
AUTH = {
    "Key" : key,
    "Email" : email
}
URL = "https://LOGAPIENDPOINT/{}/logs/requests?start={}".format(zone, start)
counter=0
r = requests.get(URL, headers=AUTH, stream=True)
for d in r.iter_lines(delimiter="\n"):
    print d
    sock.send()

print "Closing Socket"
sock.close()
sys.exit(0)

1 个答案:

答案 0 :(得分:0)

因此,通过对" \ n"进行分隔,我找到了LogStash需要知道的日志事件被终止的内容。

添加:

r = requests.get(URL, headers=AUTH, stream=True)
for d in r.iter_lines(delimiter="\n"):
    d += "\n"
    sock.send(d)

一切正常! Logstash基本上不知道如何识别一个事件结束和一个事件开始。