Как я могу полностью проанализировать json в ElasticSearch?

#elasticsearch

Вопрос:

Я анализирую ввод mongodb в logstash, файл конфигурации выглядит следующим образом:

 input {
    mongodb {
        uri => "<mongouri>"
        placeholder_db_dir => "<path>"
        collection => "modules"
        batch_size => 5000
    }
}
filter {
        mutate  {
            rename => { "_id" => "mongo_id" }
            remove_field => ["host", "@version"]
        }
        json   {
            source => "message"
            target => "log"
        } 
}
output {
        stdout {
            codec => rubydebug
        }
        elasticsearch {
            hosts => ["localhost:9200"]
            action => "index"
            index => "mongo_log_modules"
        }
}
 

Выводит 2/3 документов из коллекции в elasticsearch.

 {
    "mongo_title" => "user",
      "log_entry" => "{"_id"=>BSON::ObjectId('60db49309fbbf53f5dd96619'), "title"=>"user", "modules"=>[{"module"=>"user-dashboard", "description"=>"User Dashborad"}, {"module"=>"user-assessment", "description"=>"User assessment"}, {"module"=>"user-projects", "description"=>"User projects"}]}",
       "mongo_id" => "60db49309fbbf53f5dd96619",
        "logdate" => "2021-06-29T16:24:16 00:00",
    "application" => "mongo-modules",
     "@timestamp" => 2021-10-02T05:08:38.091Z
}
{
    "mongo_title" => "candidate",
      "log_entry" => "{"_id"=>BSON::ObjectId('60db49519fbbf53f5dd96644'), "title"=>"candidate", "modules"=>[{"module"=>"candidate-dashboard", "description"=>"User Dashborad"}, {"module"=>"candidate-assessment", "description"=>"User assessment"}]}",
       "mongo_id" => "60db49519fbbf53f5dd96644",
        "logdate" => "2021-06-29T16:24:49 00:00",
    "application" => "mongo-modules",
     "@timestamp" => 2021-10-02T05:08:38.155Z
}
 

Похоже, что вывод stdout выбрасывает непарассируемый код в

«вход в систему»

После добавления полей «переименовать» «модули» не будут добавлять поля.

Я пробовал фильтр мутирования grok, но после _id %{ДАННЫЕ}, %{СТРОКА в КАВЫЧКАХ} и %{СЛОВО} не работают для меня.

Я также попытался обновить вложенное сопоставление в индексе, но, похоже, это тоже не сработало

Есть ли что-нибудь еще, что я могу попытаться получить ПОЛНОСТЬЮ вложенный код в elasticsearch?

Ответ №1:

Решение состоит в том, чтобы фильтровать с помощью мутации

 mutate { gsub => [ "log_entry", "=>", ": " ] }
mutate { gsub => [ "log_entry", "BSON::ObjectId('([0-9a-z] )')", '"1"' ]}
json { source => "log_entry" remove_field => [ "log_entry" ] }
 

Выходы в stdout

        "_id" => "60db49309fbbf53f5dd96619",
     "title" => "user",
   "modules" => [
    [0] {
             "module" => "user-dashboard",
        "description" => "User Dashborad"
    },
    [1] {
             "module" => "user-assessment",
        "description" => "User assessment"
    },
    [2] {
             "module" => "user-projects",
        "description" => "User projects"
    }
],