我有一个标准的 ELK 堆栈,目前存储了大量日志输出。我正尝试将我的索引分离为特定于源的索引。
作为我的 FileBeats 配置的一部分,一些标准字段始终作为每条消息的一部分生成(并且特定于位置),我想将其用作我的 ES 索引的基础:
output {
elasticsearch {
hosts => ["http://elasticsearch.mydomain.com:80"]
index => "logstash-%{+YYYY.MM.dd}-%{[fields][identifier]}"
}
}
但是,ES 拒绝了某些索引,因为该字段包含大写字符 - 标识符具有可接受的值,例如麦富但也可能是我的酒吧:
[logstash.outputs.elasticsearch] Could not index event to Elasticsearch. {"reason"=>"Invalid index name [logstash-2017.06.02-MyBar], must be lowercase"}
大小写不是必需的,我可以添加变异过滤器来强制将相关字段变为小写,但我更愿意使用正确的大小写来存储标识符字段,但使用小写版本作为索引名称。
是否有可以在 elasticsearch 输出中调用的函数,将相关字段转换为小写?类似
index => "logstash-%{+YYYY.MM.dd}-%{[fields][identifier]}.lowercase()"
答案1
这可以通过一些变异技巧来实现。
- 使用 mutate 创建一个新字段,并将其设置为您的标识符。
- 在第二次变异中,将新字段改为小写。
- 在输出中使用新字段。
就像这样:
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
基于 sysadmin1138 的回答:
您可以使用@元数据字段,以防止该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]}"
}
}
这样,您可以创建具有小写标识符的索引模式,但避免小写字段出现在文档本身中。
答案3
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}"
}
}