|
2 | 2 | require "logstash/filters/base"
|
3 | 3 | require "logstash/namespace"
|
4 | 4 | require "logstash/environment"
|
| 5 | + require "logstash/event" |
5 | 6 | require "logstash/patterns/core"
|
6 | 7 | require "grok-pure" # rubygem 'jls-grok'
|
7 | 8 | require "set"
|
@@ -237,6 +238,14 @@ class LogStash::Filters::Grok < LogStash::Filters::Base
|
237 | 238 | # will be parsed and `hello world` will overwrite the original message.
|
238 | 239 | config :overwrite, :validate => :array, :default => []
|
239 | 240 |
|
| 241 | + # If this attribute is set, the output of this filter will be an array |
| 242 | + # of objects written to the key supplied in this config value. |
| 243 | + # |
| 244 | + # If this attribute is not set and the input is an array then context of |
| 245 | + # the captures will be lost and values will be grouped by capture name |
| 246 | + # rather than the message it came from. |
| 247 | + config :output_objects, :validate => :string, :default => nil |
| 248 | + |
240 | 249 | attr_reader :timeout_enforcer
|
241 | 250 |
|
242 | 251 | # Register default pattern paths
|
@@ -334,18 +343,27 @@ def match(groks, field, event)
|
334 | 343 |
|
335 | 344 | private
|
336 | 345 | def match_against_groks(groks, field, input, event)
|
| 346 | + target_event = @output_objects ? LogStash::Event.new : event |
| 347 | + |
337 | 348 | input = input.to_s
|
338 | 349 | matched = false
|
339 | 350 | groks.each do |grok|
|
340 | 351 | # Convert anything else to string (number, hash, etc)
|
341 | 352 |
|
342 | 353 | matched = @timeout_enforcer.grok_till_timeout(grok, field, input)
|
343 | 354 | if matched
|
344 |
| - grok.capture(matched) {|field, value| handle(field, value, event)} |
| 355 | + grok.capture(matched) {|field, value| handle(field, value, target_event)} |
345 | 356 | break if @break_on_match
|
346 | 357 | end
|
347 | 358 | end
|
348 |
| - |
| 359 | + |
| 360 | + if @output_objects |
| 361 | + output_array = event.get(@output_objects) |
| 362 | + output_array = [] unless output_array.is_a? Array |
| 363 | + output_array << target_event.to_hash |
| 364 | + event.set(@output_objects, output_array) |
| 365 | + end |
| 366 | + |
349 | 367 | matched
|
350 | 368 | end
|
351 | 369 |
|
|
0 commit comments