Поле слияния Logstash с корневым объектом

У меня есть ввод logstash, который выглядит так

{
    "@timestamp": "2016-12-20T18:55:11.699Z",
    "id": 1234,
    "detail": {
        "foo": 1
        "bar": "two"
    }
}

Я хотел бы объединить содержимое "детали" с корневым объектом, чтобы финальное событие выглядело так:

{
    "@timestamp": "2016-12-20T18:55:11.699Z",
    "id": 1234,
    "foo": 1
    "bar": "two"
}

Есть ли способ добиться этого без написания собственного плагина фильтра?


person kalmas    schedule 20.12.2016    source источник


Ответы (2)


Вы можете сделать это с помощью рубинового фильтра.

filter { ruby { code => " event['detail'].each {|k, v| event[k] = v } event.remove('detail') " } }

person Ethan Daugherty    schedule 20.12.2016
comment
В logstash версии 5 синтаксис был изменен на следующий code => "event.get('detail').each {|k, v| event.set(k, v) } event.remove('detail')" - person Chandru; 15.02.2018
comment
желаю, чтобы у самого Logstash была какая-то функция - person Code_Worm; 11.02.2020

Есть простой способ сделать это с помощью плагина json_encode (не включен по умолчанию).

Экстрактор json добавляет поля в корень события. Это один из немногих экстракторов, которые могут добавлять что-либо в корень.

filter {
    json_encode {
        source => "detail"
        target => "detail"
    }

    json {
        source => "detail"
        remove_field => [ "detail" ]
    }
}
person user5994461    schedule 05.06.2019