module Fluent::RecordSplitterOutputCore

Public Class Methods

included(klass) click to toggle source
# File lib/fluent/plugin/out_record_splitter/core.rb, line 7
def self.included(klass)
  klass.config_param :tag, :string, default: nil, desc: 'The output tag name.'
  klass.config_param :input_key, :string, default: nil, desc: 'The Target key to be splited.'
  klass.config_param :remove_input_key, :bool, default: false
  klass.config_param :output_key, :string, default: nil, desc: 'The generateed splitted key.'
  klass.config_param :split_stratgey, :string, default: 'lines', desc: 'the strategy used to splited the message should be either lines or regex'
  klass.config_param :append_new_line, :bool, default: false
  klass.config_param :remove_new_line, :bool, default: false
  klass.config_param :split_regex, :string, default: '/.+\n/', desc: 'Regex to split lines'
  klass.config_param :shared_keys, :array, default: [], desc: 'List of keys to be shared between all generated records.'
  klass.config_param :remove_keys, :array, default: [], desc: 'List of keys to be removed from all generated records.'
end
new() click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_record_splitter/core.rb, line 3
def initialize
  super
end

Public Instance Methods

configure(conf) click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_record_splitter/core.rb, line 20
def configure(conf)
  super

  regex = /^\/.+\/$/

  if @tag.nil?
    raise Fluent::ConfigError, "out_record_splitter: `tag` must be specified"
  end

  if @input_key.nil?
    raise Fluent::ConfigError, "out_record_splitter: `input_key` must be specified"
  end

  if @output_key.nil?
    @output_key = @input_key
  end

  if !@shared_keys.empty? && !@remove_keys.empty?
    raise Fluent::ConfigError, 'Cannot set both shared_keys and remove_keys.'
  end

  if regex.match(@split_regex.to_s)
    @split_regex = Regexp.new(@split_regex[1..-2])
  end
end
process(tag, es) click to toggle source
# File lib/fluent/plugin/out_record_splitter/core.rb, line 46
def process(tag, es)
  es.each do |time, record|
    common_keys = if !@shared_keys.empty?
                    record.select { |key, _value| @shared_keys.include?(key) }
                  elsif !@remove_keys.empty?
                    record.reject { |key, _value| @remove_keys.include?(key) }
                  else
                     record.dup
                  end

    if @remove_input_key && @output_key != @input_key
      common_keys.delete(@input_key)
    end

    next unless record.key?(@input_key)
    message = record[@input_key]
    lines = split_lines message

    lines.each do |l|
      keys = common_keys.merge(@output_key => l)
      router.emit(@tag, time, keys)
    end
  end
end
split_lines(message) click to toggle source
# File lib/fluent/plugin/out_record_splitter/core.rb, line 71
def split_lines(message)
  message = "#{message}\n" if @append_new_line

  messages = if @split_stratgey == 'lines'
                   message.to_s.lines
             else
               message.scan(@split_regex)
             end
  messages = messages.map{|m| m.gsub("\n",'') } if @remove_new_line
  messages
end