Logsta sh - парсить массив JSON - PullRequest
       70

Logsta sh - парсить массив JSON

0 голосов
/ 04 августа 2020

Я пытаюсь разобрать события SendGrid Webhook с помощью Logsta sh. Проблема в том, что вывод Logsta sh - это не массив JSON, а только JSON. Квадратные скобки отсутствуют.

Причина, по которой я это делаю, - это местоположение GeoIP и синтаксический анализ UserAgent для аналитики.

Я отправляю сообщение на 127.0.0.1:3000, затем я хочу переслать вывод на 127.0.0.1:8080. 8080 - это просто базовый c Express сервер, который печатает запросы / ответы и отправляет окончательные данные в ElasticSearch.

Это входные данные:

[
  {
    "email": "email@domain.com",
    "event": "click",
    "ip": "8.8.8.8",
    "sg_event_id": "WS1wXXhERnefBsqEt5FSFA",
    "sg_message_id": "mk4Msf8nQvycsZIAHQPOrw.filter0321p1iad2-30191-5E686C57-5D.0",
    "timestamp": 1596484698,
    "url": "http://10.0.0.6/ServiceCenter/view",
    "url_offset": { "index": 1, "type": "html" },
    "useragent": "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
  }
]

Это результат:

{
  sg_event_id: 'WS1wXXhERnefBsqEt5FSFA',
  event: 'click',
  email: 'email@domain.com',
  sg_message_id: 'mk4Msf8nQvycsZIAHQPOrw.filter0321p1iad2-30191-5E686C57-5D.0',
  timestamp: 1596484698,
  useragent: 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
  ip: '8.8.8.8',
  url: 'http://10.0.0.6/ServiceCenter/view',
  url_offset: { index: 1, type: 'html' }
}

Это мой конфиг:

input {
  http {
    host => "127.0.0.1"
    port => "8080"
  }
}

filter {
  mutate {
    remove_field => [ "@version", "@timestamp", "headers", "host" ]
  }
}

output {
  http {
    http_method => "post"
    url => "http://127.0.0.1:3000"
  }
  stdout {
    codec => rubydebug
  }
}

1 Ответ

0 голосов
/ 04 августа 2020

Итак, наконец, я нашел обходной путь, чтобы сделать это с помощью фильтра json_encode.

  1. Используется код ruby для хранения ключей и значений в @DATA[oldJSON]
  2. Использовал плагин json_encode на @DATA[oldJSON] и сохранял результаты в @DATA[newJSON]
  3. Важно: установите http-вывод format => message и content_type => "application/json; charset=UTF-8". По умолчанию text/plain, и мы этого не хотим.
  4. Установите значение сообщения '[ %{[@DATA][newJSON]} ]'

Конфигурация:

input {
  http {
    host => "127.0.0.1"
    port => "8080"
  }
}

filter {
  mutate {
    remove_field => [
      "@version",
      "@timestamp",
      "headers",
      "host"
    ]
  }
      ruby {
        code => '
            event.to_hash.each { |k,v|
                event.set("[@DATA][oldJSON][#{k}]", v)
    }
        '
  }
    json_encode {
      source => "[@DATA][oldJSON]"
      target => "[@DATA][newJSON]"
  }
  
}

output { 
  http {
    http_method => "post"
    url => "http://127.0.0.1:3000"
    format => message
    content_type => "application/json; charset=UTF-8"
    message => '[ %{[@DATA][newJSON]} ]'
    }
  }

Вывод:

[
  {
    ip: '8.8.8.8',
    sg_message_id: 'mk4Msf8nQvycsZIAHQPOrw.filter0321p1iad2-30191-5E686C57-5D.0',
    url_offset: { type: 'html', index: 1 },
    sg_event_id: 'WS1wXXhERnefBsqEt5FSFA',
    email: 'email@domain.com',
    event: 'click',
    url: 'http://10.0.0.6/ServiceCenter/view',
    timestamp: 1596484698,
    useragent: 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'
  }
]

Может кому пригодится.

...