Logstash JSON Parse - PullRequest
       10

Logstash JSON Parse

0 голосов
/ 26 октября 2018

Я новичок в Logstash, в настоящее время я пытаюсь читать файлы из S3 (каждая новая строка файла - это новый json) и анализировать поля JSON для отправки только части в ES.

Удивительно, как Logstash поддерживает меня с этим, так как до сих пор все было гладко:

input { s3 { ... } }

Мне даже не нужно было явно указывать, что файлы GZiped, или этот кодек - JSON, что меня все равно удивляет, как Logstash разрешает это.

Но ... теперь Если я дам сразу:

output { elasticsearch { ... } }

тогда все мое тело JSON попадает в строку «сообщения» внутри ElasticSearch. Итак, я сделал это:

filter { json { source => "message" } }

После этого я вижу, что каждый дочерний элемент из моего JSON анализируется как отдельное значение в ES - это прекрасно, но что если я хочу отправить в ES только 2 или 3 дочерних элемента из JSON?

Мой пример структуры в формате JSON:

{"path":"/h/asia","headers":{"x-forwarded-for":"1.1.1.1","user-agent":"Mozilla/5.0"},"params":{"filters_values":"test","pagecount":"2","user_status":"unlogged"},"meta":{"date":1538974058,"acceptCookies":true}}

Итак, в конце я приземляюсь в ES с такими полями, как:

"path.headers.x-forwarded-for", 
"params.pagecount", 
"params.user_status" etc.

Где моя цель - хранить в ES только два типа "params.filters_values" и "headers.user_agent".

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Использовать remove_field в фильтре json

filter {
  json {
    source => "message"
    remove_field => [ "path.headers.x-forwarded-for", "params.pagecount", .. ]
  }
}
0 голосов
/ 27 октября 2018

Вы можете использовать фильтр prune, чтобы выбрать нужные поля:

filter {
  prune {
    whitelist_names => [ "params", "headers" ]
  }
}

Однако, есть ограничение, что вы можете делать это только на полях верхнего уровня, поэтому не совсем то, что вам нужно.

https://www.elastic.co/guide/en/logstash/current/plugins-filters-prune.html

...