У меня есть стандартный стек 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()"
Это можно сделать с помощью небольшого обмана.
Вот так:
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}"
}
}