Как разделить большой входной файл json на другой эластичный поисковый индекс?
Вход в logstash является
input {
file {
path => "/tmp/very-large.json"
type => "json"
start_position => "beginning"
sincedb_path => "/dev/null"
}
и образец файла JSON
{"type":"type1", "msg":"..."}
{"type":"type2", "msg":"..."}
{"type":"type1", "msg":"..."}
{"type":"type3", "msg":"..."}
Можно ли сделать так, чтобы они вводились в другой эластичный поисковый индекс, чтобы в будущем их было проще обрабатывать?
Я знаю, можно ли назначить их с tag
тогда я могу сделать что-то вроде
if "type1" in [tags] {
elasticsearch {
hosts => ["localhost:9200"]
action => "index"
index => "logstash-type1%{+YYYY.MM.dd}"
flush_size => 50
}
}
Как сделать похожую вещь, посмотрев на конкретное значение поля JSON, например type
в моем примере выше?
2 ответа
Еще проще, просто используйте type
поле для построения имени индекса следующим образом:
elasticsearch {
hosts => ["localhost:9200"]
action => "index"
index => "logstash-%{type}%{+YYYY.MM.dd}"
flush_size => 50
}
Вы можете сравнить на любых полях. Сначала вам придется проанализировать ваш json с помощью фильтра или кодека json.
Тогда у вас будет type
поле для работы, вот так:
if [type] == "type1" {
elasticsearch {
...
index => "logstash-type1%{+YYYY.MM.dd}"
}
} else if [type] == "type2" {
elasticsearch {
...
index => "logstash-type2%{+YYYY.MM.dd}"
}
} ...
Или как в ответе Вала:
elasticsearch {
hosts => ["localhost:9200"]
action => "index"
index => "logstash-%{type}%{+YYYY.MM.dd}"
flush_size => 50
}