2017-05-24 71 views
0

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

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) 

回答

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基本上不知道如何识别一个事件结束,一个事件开始。