Как разделить большой входной файл 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  
}
Другие вопросы по тегам