Итерация Python и отправка данных через сокет (Logstash/Elasticsearch)

Я пытаюсь выполнить потоковую передачу данных JSON и передать каждое отдельное событие JSON (разделенное '\n') в сокет TCP, который связывается с LogStash (localhost 5000). Однако я могу только заполнить последний объект json в Elasticsearch через LogStash. Я могу проверить работу вызова API и должен содержать около 70 отдельных событий. Только последний из них попадает в Elasticsearch через эту точку входа LogStash. Я также проверил поток и разделитель в запросе работает, и возвращает одно событие 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 ответ

Получается, что, ограничив "\n", я избавился от того, что LogStash должен видеть, чтобы знать, что событие журнала завершено.

Добавляя:

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

Все работает! Logstash в основном не знал, как распознать одно событие закончилось и одно событие началось.

Другие вопросы по тегам