Выбери дефис в полях для logstash - PullRequest
1 голос
/ 21 ноября 2019

У меня проблема с синтаксическим анализом logstash, мне нужно извлечь поле, разделенное дефисом:

if "[payload][text][code][session-id]" {
  mutate {
    add_field => { "session-id" => "%{[payload][text][code][session-id]}" }
  }
}

, условное выражение работает из-за кавычек, но когда я запускаю фильтр, оно возвращает:

t session-id: %{[payload][text][code][session-id]}

и то, что я ожидаю, это:

t session-id: HK5wfPQgzkKHmgzVF

как я могу определить границы в поле полезной нагрузки?

1 Ответ

1 голос
/ 22 ноября 2019

Ваше условие неверно, если поместить имя поля между двойными кавычками, оно станет строкой, и оно всегда будет истинным, поэтому ваш фильтр mutate всегда будет запускаться и добавлять поле session-id с содержимым поля [payload][text][code][session-id], если поле не существует, строка %{[payload][text][code][session-id]} будет добавлена ​​в session-id в качестве значения поля.

Ваше условие должно быть if [payload][text][code][session-id] без двойных кавычек.

Вы можете воспроизвести это поведение с помощью следующего тестового конвейера

input {
    generator {
        message => "HK5wfPQgzkKHmgzVF"
        count => 1
    }
}
filter {
    dissect {
        mapping => {
            "message" => "%{[payload][text][code][session-id]}"
        }
    }
    if "[payload][text][code][session-id]" {
        mutate {
            add_field => { "session-id" => "%{[payload][text][code][session-id]}"}
        }
    }
}
output {
    stdout { }
}

Запуск этого конвейера даст вам поле session-id со значением HK5wfPQgzkKHmgzVF, поскольку поле [payload][text][code][session-id] существует, а ваше условие всегдаtrue, если вы измените имя поля на [payload][text][code][session-id-test] в блоке dissect и снова запустите конвейер, значение session-id теперь будет %{[payload][text][code][session-id]}.

Удалите двойные кавычки изусловное, и оно будет истинным, только если поле [payload][text][code][session-id] действительно существует.

...