Избегайте коллизии ключа «тип», когда и событие, и ввод logstash предоставляют значения

Я пытаюсь написать конвейер для загрузки файла в logstash. Моя настройка требует указать в поле type в разделе ввода значение Запуск нескольких независимых файлов конфигурации logstash с вводом, фильтрацией и выводом. К сожалению, исходные данные уже содержат поле type, и похоже, что значение из исходных данных конфликтует со значением, предоставленным из входной конфигурации.

Исходные данные содержат массив json, подобный следующему

[
  {"key1":"obj1", "type":"looks like a bad choose for a key name"},
  {"key1":"obj2", "type":"you can say that again"}
]

Мой конвейер выглядит следующим образом

input {
  exec {
    command => "cat /path/file_containing_above_json_array.txt"
    codec => "json"
    type => "typeSpecifiedInInput"
    interval => 3600
  }
}

output {
  if[type] == "typeSpecifiedInInput" { 
    stdout {
      codec => rubydebug
    }
  }
}

Выход никогда не вызывается, потому что type было установлено значение, предоставленное из исходных данных, а не значение, предоставленное из раздела ввода.

Как настроить входной конвейер, чтобы избежать этого конфликта?

Натан


person Nathan Reese    schedule 06.04.2016    source источник


Ответы (2)


Создайте новое поле для ввода вместо повторного использования «типа». Входные данные exec{} имеют добавить_поле доступно.

person Alain Collins    schedule 06.04.2016
comment
Спасибо за предложение. Это сработало. Я обновил ответ завершенным конвейером, используя ваше предложение. - person Nathan Reese; 07.04.2016

Ниже показан окончательный конвейер, в котором используется add_field вместо type. Добавлен этап фильтрации для очистки документа, чтобы поле type содержало ожидаемое значение, необходимое для записи в ElasticSearch (класс похожих документов). Значение type из исходного документа JSON сохраняется в ключе typeSpecifiedFromDoc. Шаг мутации пришлось разбить на отдельные этапы, чтобы замена не повлияла на type до того, как его исходное значение будет добавлено в качестве нового поля typeSpecifiedFromDoc.

input {
  exec {
    command => "cat /path/file_containing_above_json_array.txt"
    codec => "json"
    add_field => ["msgType", "typeSpecifiedInInput"]
    interval => 3600
  }
}

filter {
  if[msgType] == "typeSpecifiedInInput" {
    mutate {
      add_field => ["typeSpecifiedFromDoc", "%{type}"]
    }
    mutate {
      replace => ["type", "%{msgType}"]
      remove_field => ["msgType"]
    }
  }
}

output {
  if[type] == "typeSpecifiedInInput" { 
    stdout {
      codec => rubydebug
    }
  }
}
person Nathan Reese    schedule 09.04.2016