У меня есть стандартный стек 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
, но это не должно иметь большого значения.
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.
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}"
}
}