Class: LogStash::Filters::Split

Inherits:
Base
  • Object
show all
Defined in:
lib/logstash/filters/split.rb

Overview

The split filter clones an event by splitting one of its fields and placing each value resulting from the split into a clone of the original event. The field being split can either be a string or an array.

An example use case of this filter is for taking output from the <<plugins-inputs-exec,exec input plugin>> which emits one event for the whole output of a command and splitting that output by newline - making each line an event.

Split filter can also be used to split array fields in events into individual events. A very common pattern in JSON & XML is to make use of lists to group data together.

For example, a json structure like this:

source,js

{ field1: …,

results: [
  { result ... },
  { result ... },
  { result ... },
  ...

] }


The split filter can be used on the above data to create separate events for each value of ‘results` field

source,js

filter {

split {
  field => "results"
}

}


The end result of each split is a complete copy of the event with only the current split section of the given field changed.

Constant Summary collapse

PARSE_FAILURE_TAG =
'_split_type_failure'.freeze

Instance Method Summary collapse

Instance Method Details

#filter(event) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/logstash/filters/split.rb', line 64

def filter(event)
  original_value = event.get(@field)

  if original_value.is_a?(Array)
    splits = @target.nil? ? event.remove(@field) : original_value
  elsif original_value.is_a?(String)
    # Using -1 for 'limit' on String#split makes ruby not drop trailing empty
    # splits.
    splits = original_value.split(@terminator, -1)
  else
    logger.warn("Only String and Array types are splittable. field:#{@field} is of type = #{original_value.class}")
    event.tag(PARSE_FAILURE_TAG)
    return
  end

  # Skip filtering if splitting this event resulted in only one thing found.
  return if splits.length == 1 && original_value.is_a?(String)

  # set event_target to @field if not configured
  event_target = @target.nil? ? @field : @target

  splits.each do |value|
    next if value.nil? || (value.is_a?(String) && value.empty?)
    @logger.debug? && @logger.debug("Split event", :value => value, :field => @field)

    event_split = event.clone
    event_split.set(event_target, value)
    filter_matched(event_split)

    # Push this new event onto the stack at the LogStash::FilterWorker
    yield event_split
  end

  # Cancel this event, we'll use the newly generated ones above.
  event.cancel
end

#registerObject



61
62
# File 'lib/logstash/filters/split.rb', line 61

def register
end