Logstash делает копию вложенного поля с помощью mutate.добавить поле

Я хотел сделать копию вложенного поля в фильтре Logstash, но я не могу выяснить, правильный синтаксис. Вот что я пытаюсь:

неправильный синтаксис:

mutate {
    add_field => { "received_from" => %{beat.hostname} }
}

бить.имя хоста не заменяется

mutate {
    add_field => { "received_from" => "%{beat.hostname}" }
}

бить.имя хоста не заменяется

mutate {
    add_field => { "received_from" => "%{[beat][hostname]}" }
}

бить.имя хоста не заменяется

mutate {
    add_field => { "received_from" => "%[beat][hostname]" }
}

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

структура данных, полученная logstash, является следующий:

{
       "@timestamp" => "2016-08-24T13:01:28.369Z",
             "beat" => {
                "hostname" => "etg-dbs-master-tmp",
                "name" => "etg-dbs-master-tmp"
    },
            "count" => 1,
               "fs" => {
        "device_name" => "/dev/vdb",
              "total" => 5150212096,
               "used" => 99287040,
             "used_p" => 0.02,
               "free" => 5050925056,
              "avail" => 4765712384,
              "files" => 327680,
         "free_files" => 326476,
        "mount_point" => "/opt/ws-etg/datas"
    },
             "type" => "filesystem",
         "@version" => "1",
             "tags" => [
                [0] "topbeat"
              ],
      "received_at" => "2016-08-24T13:01:28.369Z",
    "received_from" => "%[beat][hostname]"
}

1 ответов


EDIT:

так как вы не показали свое входное сообщение, я отработал ваш выход. В вашем выводе поле, в которое вы пытаетесь скопировать, уже существует, поэтому вам нужно использовать replace. Если он не существует, вам действительно нужно использовать add_field. Я обновил свой ответ для обоих случаев.

EDIT 2: я понял, что ваша проблема может заключаться в доступе к вложенному значению, поэтому я добавил Это:)

вы используете мутирующий фильтр неправильно / назад.

первая ошибка:

вы хотите заменить поле, а не добавить. В документах он дает вам опцию "заменить". Смотрите: https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-replace

Вторая ошибка, вы используете синтаксис в обратном. Кажется, вы верите, что это правда:

"text I want to write" => "Field I want to write it in" 

а это правда:

"myDestinationFieldName" => "My Value to be in the field" 

С этим знанием, мы можем теперь сделать это:

mutate {
    replace => { "[test][a]" => "%{s}"}
}

или если вы хотите добавить новое не существующее поле:

mutate {
        add_field => {"[test][myNewField]" => "%{s}"}
}

или добавьте новое существующее поле со значением вложенного поля:

mutate {
        add_field =>  {"some" => "%{[test][a]}"}
}

или более подробно, в моем примере:

input {
  stdin {
  }
}

filter {
    json {
        source => "message"
    }

    mutate {
        replace => { "[test][a]" => "%{s}"}
        add_field => {"[test][myNewField]" => "%{s}"}
        add_field => {"some" => "%{[test][a]}"}
    }
}

output {
          stdout { codec => rubydebug }
}

этот пример использует stdin и выводит в stdout. Он использует фильтр json для анализа сообщения, а затем мутирующий фильтр для замены вложенного поля. Я также добавляю совершенно новое поле во вложенный тестовый объект. И, наконец, создает новое поле "некоторые", которое имеет значение test.а

Итак, для этого сообщения:

{"test" : { "a": "hello"}, "s" : "to_Repalce"}

мы хотим заменить тест.a (значение: "Hello") с s (значение: "to_Repalce") и добавьте полевой тест.myNewField со значением s.

на мой терминал:

artur@pandaadb:~/dev/logstash$ ./logstash-2.3.2/bin/logstash -f conf2/
Settings: Default pipeline workers: 8
Pipeline main started
{"test" : { "a": "hello"}, "s" : "to_Repalce"}
{
   "message" => "{\"test\" : { \"a\": \"hello\"}, \"s\" : \"to_Repalce\"}",
  "@version" => "1",
"@timestamp" => "2016-08-24T14:39:52.002Z",
      "host" => "pandaadb",
      "test" => {
             "a" => "to_Repalce",
    "myNewField" => "to_Repalce"
},
         "s" => "to_Repalce"
         "some" => "to_Repalce"
}

значение успешно заменено.

добавлено поле "некоторые" со значением replaces

добавлено новое поле во вложенном массиве.

если вы используете add_field, он преобразует a в массив и добавит туда ваше значение.

надеюсь, это решит вашу проблему,

Артур