Тип поля изменения Elasticsearch из фильтра рассечения

Я использую logstash-logback-encoder для отправки файлов журнала Java в logstash, а затем в elasticsearch. Чтобы проанализировать message в журнале Java, я использую следующий фильтр для анализа сообщения

input {
  file {
    path => "/Users/MacBook-201965/Work/java/logs/oauth-logstash.log"
    start_position => "beginning"
    codec => "json"
  }
}

filter {
  if "EXECUTION_TIME" in [tags] {
    dissect {
      mapping => {
        "message" => "%{endpoint} timeMillis:[%{execution_time_millis}] data:%{additional_data}"
      }
    }
    mutate {
      convert => { "execution_time_millis" => "integer" }
    }
  }
}

output {
  elasticsearch { 
     hosts => "localhost:9200"
     index => "elk-%{+YYYY}"
     document_type => "log"
  }

  stdout {
    codec => json
  }
}

Он анализирует сообщение, поэтому я могу получить значение execution_time_millis. Однако тип данных — строка. Я создал индекс, используя шаблон индекса Kibana. Как я могу изменить тип данных execution_time_millis на длинный?

Вот пример json-сообщения из журнала

{  
   "message":"/tests/{id} timeMillis:[142] data:2282||0:0:0:0:0:0:0:1",
   "logger_name":"com.timpamungkas.oauth.client.controller.ElkController",
   "level_value":20000,
   "endpoint":"/tests/{id}",
   "execution_time_millis":"142",
   "@version":1,
   "host":"macbook201965s-MacBook-Air.local",
   "thread_name":"http-nio-8080-exec-7",
   "path":"/Users/MacBook-201965/Work/java/logs/oauth-logstash.log",
   "@timestamp":"2018-01-04T11:20:20.100Z",
   "level":"INFO",
   "tags":[  
      "EXECUTION_TIME"
   ],
   "additional_data":"2282||0:0:0:0:0:0:0:1"
}{  
   "message":"/tests/{id} timeMillis:[110] data:2280||0:0:0:0:0:0:0:1",
   "logger_name":"com.timpamungkas.oauth.client.controller.ElkController",
   "level_value":20000,
   "endpoint":"/tests/{id}",
   "execution_time_millis":"110",
   "@version":1,
   "host":"macbook201965s-MacBook-Air.local",
   "thread_name":"http-nio-8080-exec-5",
   "path":"/Users/MacBook-201965/Work/java/logs/oauth-logstash.log",
   "@timestamp":"2018-01-04T11:20:19.780Z",
   "level":"INFO",
   "tags":[  
      "EXECUTION_TIME"
   ],
   "additional_data":"2280||0:0:0:0:0:0:0:1"
}

Спасибо


person Timothy    schedule 04.01.2018    source источник


Ответы (1)


Если вы уже проиндексировали документы, вам придется переиндексировать данные после изменения типа данных любого поля.

Однако вы можете использовать что-то подобное, чтобы изменить тип millis со строки на целое число. (long здесь не поддерживается)

https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-convert

Кроме того, попробуйте определить шаблон elasticsearch перед созданием индекса, если вы собираетесь добавить несколько индексов с именами индексов, имеющими некоторый шаблон регулярного выражения. В противном случае вы также можете заранее определить формат индекса, а затем начать индексирование.

person abhishek627    schedule 04.01.2018
comment
После этого проверьте свои проиндексированные данные, `execution_time-millis' будет проиндексирован как целое число. - person abhishek627; 04.01.2018
comment
Спасибо, я сделал, как вы предложили раньше. Бывает, что у меня опечатка на фильтре mutate. Теперь это работает. - person Timothy; 05.01.2018