Я использую logstash для приема сообщений XML через плагин фильтра xml. Рассмотрим следующий пример xml:

<fruit.producer1:Apple>
    ...
</fruit.producer1:Apple>
<fruit.producer2:Apple>
    ...
</fruit.producer2:Apple>

Моя конфигурация фильтра следующая:

filter {
    xml {
        source => "message"
        force_array => false
        target => "fruit"
    }
}

Результат после фильтра, который отправляется в elasticsearch:

...
"Apple": {
    ...
},
"Apple": {
    ...
}
...

Как видите, у меня нет способа отличить Apple от producer1 или producer2. Я играл с параметром remove_namespaces в конфигурации фильтра, но, похоже, ничего не работает. Как я могу гарантировать, что информация о префиксе сохраняется в выводе для elasticsearch?

0
PCL 20 Сен 2018 в 06:05

2 ответа

Лучший ответ

Elasticsearch не любит . или : в именах полей. Решением было использовать gsub в необработанном сообщении перед фильтром xml.

filter {
    mutate {
        gsub => [
            "message", "fruit.producer1:Apple", "fruit_producer1_Apple",
            "message", "fruit.producer2:Apple", "fruit_producer2_Apple"
       ]
    }

    xml {
        source => "message"
        force_array => false
        target => "fruit"
    }
}

Результаты в:

"fruit": {
    "fruit_producer1_Apple": {
        ...
    },
    "fruit_producer2_Apple": {
        ...
    },
    ...
}
0
PCL 28 Сен 2018 в 01:01

В Elasticsearch 2.0 точки в именах полей не допускались. Вероятно, поэтому xml-фильтр мог быть закодирован таким образом. Вы можете попробовать добавить еще один фильтр, чтобы заменить точки на подчеркивание или что-то еще. Рубиновый фильтр должен помочь, поскольку он доступен здесь: https: // обсудить .elastic.co поле имя - может / т / не - содержать / 33251 / 38

0
nitzien 20 Сен 2018 в 04:21