Назад | Перейти на главную страницу

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()"

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

  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 в ваших индексах, но это не должно иметь большого значения.

Основываясь на sysadmin1138's ответ:

Вы можете использовать @metadata поле, чтобы предотвратить lc_identifier поле не отображаться в ваших документах во время индексации.

В вашем фильтре измените:

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

Кому:

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

И чтобы вызвать его на выходе:

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

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

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}"
  }
}