Do you want to split the event into multiple events, each of which has a username
, age
, and occupation
?
If so, you'll need to do a sequence of things, using the [@metadata]
namespace (which is not exported from Logstash by default):
- Use the JSON Filter to extract the object from the JSON string into
[@metadata][string-indexed]
- Convert the string-indexed object into an Array (
[@metadata][items-array]
) - Split the Event on the resulting array, putting the result at
[@metadata][single-item]
- Do some cleanup to move the relevant sub-keys up to the top namespace.
filter {
json {
source => "message"
target => "[@metadata][string-indexed]"
}
ruby {
code => "
# extract the string-indexed object to a local variable
string_indexed = event.get('[@metadata][string-indexed]')
# iterate over the keys in the order of the string-encoded integer index
items_array = string_indexed.keys.sort_by(&:to_i).map do |key|
# get the item from the indexed map
string_indexed[key]
end
# set the items array.
event.set('[@metadata][items-array]', items_array)
"
}
split {
field => "[@metadata][items-array]"
target => "[@metadata][single-item]"
}
mutate {
rename => {
"[@metadata][single-item][username]" => "username"
"[@metadata][single-item][age]" => "age"
"[@metadata][single-item][occupation]" => "occupation"
}
}
}