Sha256: 67811fef348b281448a8b82de246474110bfae499fdeffdc5f6d6166e291e47a

Contents?: true

Size: 1.64 KB

Versions: 1

Compression:

Stored size: 1.64 KB

Contents

require 'fluent/plugin/parser'

SubParser = Struct.new(:parser, :index, :name)
FORMAT_NAME = "format_name"

module Fluent
  module Plugin
    class MultiFormatParser < Parser
      Plugin.register_parser('multi_format', self)
      config_param :format_key, :string, default: ''
      config_param :index_key, :string, default: ''

      def initialize
        super

        @parsers = []
        @format_key = ''
        @index_key = ''
      end

      def configure(conf)
        super

        conf.elements.each_with_index { |e, i|
          next unless ['pattern', 'format'].include?(e.name)
          next if e['format'].nil? && (e['@type'] == 'multi_format')
          parser = SubParser.new
          format_name = e.delete(FORMAT_NAME) || ""+e['format']+"#"+i.to_s
          parser.parser = Plugin.new_parser(e['format'])
          parser.index = i
          parser.name = format_name
          parser.parser.configure(e)
          @parsers << parser
        }
      end

      def parse(text)
        @parsers.each { |subparser|
          begin
            subparser.parser.parse(text) { |time, record|
              if time && record
                if ! (@format_key.nil? || @format_key.empty?)
                  record[@format_key] = subparser.name
                end
                if ! (@index_key.nil? || @index_key.empty?)
                  record[@index_key] = subparser.index
                end
                yield time, record
                return
              end
            }
          rescue # ignore parser error
          end
        }

        yield nil, nil
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
fluent-multi-format-parser-1.1.0 lib/fluent/plugin/parser_multi_format.rb