Json в Elasticsearch через API - PullRequest
       1

Json в Elasticsearch через API

0 голосов
/ 03 января 2019

Я пытаюсь добавить файл json в эластичный поиск, который содержит около 30 000 строк, и он неправильно отформатирован. Я пытаюсь загрузить его через Bulk API, но не могу найти способ правильно отформатировать его, который действительно работает. Я использую Ubuntu 16.04LTS.

Это формат JSON:

{
    "rt": "2018-11-20T12:57:32.292Z",
    "source_info": { "ip": "0.0.60.50" },
    "end": "2018-11-20T12:57:32.284Z",
    "severity": "low",
    "duid": "5b8d0a48ba59941314e8a97f",
    "dhost": "004678",
    "endpoint_type": "computer",
    "endpoint_id": "8e7e2806-eaee-9436-6ab5-078361576290",
    "suser": "Katerina",
    "group": "PERIPHERALS",
    "customer_id": "a263f4c8-942f-d4f4-5938-7c37013c03be",
    "type": "Event::Endpoint::Device::AlertedOnly",
    "id": "83d63d48-f040-2485-49b9-b4ff2ac4fad4",
    "name": "Peripheral allowed: Samsung Galaxy S7 edge"
}

Я знаю, что формат для Bulk API требует {"index":{"_id":*}} перед каждым объектом json в файле, который будет выглядеть следующим образом:

{"index":{"_id":1}}

{
    "rt": "2018-11-20T12:57:32.292Z",
    "source_info": { "ip": "0.0.60.50" },
    "end": "2018-11-20T12:57:32.284Z",
    "severity": "low",
    "duid": "5b8d0a48ba59941314e8a97f",
    "dhost": "004678",
    "endpoint_type": "computer",
    "endpoint_id": "8e7e2806-eaee-9436-6ab5-078361576290",
    "suser": "Katerina",
    "group": "PERIPHERALS",
    "customer_id": "a263f4c8-942f-d4f4-5938-7c37013c03be",
    "type": "Event::Endpoint::Device::AlertedOnly",
    "id": "83d63d48-f040-2485-49b9-b4ff2ac4fad4",
    "name": "Peripheral allowed: Samsung Galaxy S7 edge"
}

Если я вставлю идентификатор индекса вручную, а затем использую это выражение curl -s -H "Content-Type: application/x-ndjson" -XPOST localhost:92100/ivc/default/bulk?pretty --data-binary @results.json, он будет загружен без ошибок.

У меня вопрос, как я могу добавить индексный идентификатор {"index":{"_id":*}} к каждой строке json, чтобы он был готов к загрузке? Очевидно, что идентификатор индекса должен добавлять +1 к каждой строке, есть ли способ сделать это из CLI?

Извините, если этот пост не выглядит должным образом, я прочитал миллионы постов в Stack Overflow, но это мой первый! # Отчаянные

Большое спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Спасибо за все ответы, они помогли мне войти в правильном направлении.

Я создал скрипт bash для автоматизации загрузки, форматирования и загрузки журналов в Elasticsearch:

#!/bin/bash

echo "Downloading logs from Sophos Central. Please wait."

cd /home/user/ELK/Sophos-Central-SIEM-Integration/log

#This deletes the last batch of results
rm result.json
cd .. 

#This triggers the script to download a new batch of logs from Sophos

./siem.py
cd /home/user/ELK/Sophos-Central-SIEM-Integration/log

#Adds newline at the beginning of the logs file
sed -i '1 i\{"index":{}}' result.json

#Adds indexes
sed -i '3~2s/^/{"index":{}}/' result.json

#Adds json file to elasticsearch 
curl -s -H "Content-Type: application/x-ndjson" -XPOST localhost:9200/ivc/default/_bulk?pretty --data-binary @result.json

Так вот как я этого добился. Возможно, есть более простые варианты, но этот помог мне. Надеюсь, что это может быть полезно для кого-то еще!

Еще раз спасибо всем! : D

0 голосов
/ 03 января 2019

Ваша проблема в том, что Elasticsearch ожидает, что документ будет действительным json в ОДНОЙ строке, например:

{"index":{"_id":1}}
{"rt":"2018-11-20T12:57:32.292Z","source_info":{"ip":"0.0.60.50"},"end":"2018-11-20T12:57:32.284Z","severity":"low","duid":"5b8d0a48ba59941314e8a97f","dhost":"004678","endpoint_type":"computer","endpoint_id":"8e7e2806-eaee-9436-6ab5-078361576290","suser":"Katerina","group":"PERIPHERALS","customer_id":"a263f4c8-942f-d4f4-5938-7c37013c03be","type":"Event::Endpoint::Device::AlertedOnly","id":"83d63d48-f040-2485-49b9-b4ff2ac4fad4","name":"Peripheral allowed: Samsung Galaxy S7 edge"}

Вам нужно найти способ преобразовать ваш входной файл, чтобы у вас был документлиния, тогда вам будет хорошо пойти с решением Вэла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...