Logstash / Elasticsearch - преобразование полей в нижний регистр в выходной конфигурации

У меня есть стандартный стек ELK, в котором в настоящее время хранится множество выходных журналов. Я пытаюсь разделить свои индексы, чтобы они зависели от источника.

Как часть моей конфигурации FileBeats, некоторые стандартные поля всегда генерируются как часть каждого сообщения (и зависят от местоположения), которые я хочу использовать в качестве основа для моего индекса ES:

output {
  elasticsearch {
    hosts => ["http://elasticsearch.mydomain.com:80"]
    index => "logstash-%{+YYYY.MM.dd}-%{[fields][identifier]}"
  }
}

Однако, ES отклоняет некоторые индексы, поскольку поле содержит символы верхнего регистра - идентификатор имеет допустимые значения, такие как myfoo , но также может быть MyBar :

[logstash.outputs.elasticsearch] Could not index event to Elasticsearch. {"reason"=>"Invalid index name [logstash-2017.06.02-MyBar], must be lowercase"}

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

Есть ли функция, которую можно вызвать в elasticsearch вывод, чтобы строчные буквы в рассматриваемом поле? Что-то вроде

    index => "logstash-%{+YYYY.MM.dd}-%{[fields][identifier]}.lowercase()"
2
задан 24 June 2017 в 00:07
3 ответа

Это можно сделать с помощью немного большего обмана с изменением .

  1. Создайте новое поле с помощью функции mutate, задав свой идентификатор.
  2. Во втором случае измените новое поле строчными буквами.
  3. Используйте новое поле в выходных данных.

Примерно так:

filter {
  mutate {
    add_field => { "lc_identifier" => "%{fields}%{identifier}" }
  }
  mutate {
    lowercase => [ "lc_identifier" ]
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch.example.com:80"]
    index => "logstash-%{+YYYY.MM.dd}-%{[lc_identifier]}"
  }
}

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

2
ответ дан 3 December 2019 в 12:36

Building on sysadmin1138's answer:

You can use the @metadata field to prevent the lc_identifier field from appearing in your documents while indexed.

In your filter, change:

filter {
  mutate {
    add_field => { "lc_identifier" => "%{fields}%{identifier}" }
  }
  mutate {
    lowercase => [ "lc_identifier" ]
  }
}

To:

filter {
  mutate {
    add_field => { "[@metadata][lc_identifier]" => "%{fields}%{identifier}" }
  }
  mutate {
    lowercase => [ "[@metadata][lc_identifier]" ]
  }
}

And to call it in your output:

output {
  elasticsearch {
    hosts => ["http://elasticsearch.example.com:80"]
    index => "logstash-%{+YYYY.MM.dd}-%{[@metadata][lc_identifier]}"
  }
}

This way you can create an index pattern with a lowercase identifier, but avoid having the lowercase field appear in the documents themselves.

0
ответ дан 3 December 2019 в 12:36
filter {
  mutate {
    add_field => { "lc_identifier" => "%{fields}" }
  }
  mutate {
    lowercase => [ "lc_identifier" ]
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch.example.com:80"]
    index => "logstash-%{+YYYY.MM.dd}-%{lc_identifier}"
  }
}
-1
ответ дан 3 December 2019 в 12:36

Теги

Похожие вопросы