class LogStash::Codecs::CSV

Constants

CONVERTERS

Public Class Methods

new(*params) click to toggle source
Calls superclass method
# File lib/logstash/codecs/csv.rb, line 111
def initialize(*params)
  super

  @original_field = ecs_select[disabled: nil, v1: '[event][original]']

  @converter = LogStash::Util::Charset.new(@charset)
  @converter.logger = @logger
end

Public Instance Methods

decode(data) { |event| ... } click to toggle source
# File lib/logstash/codecs/csv.rb, line 136
def decode(data)
  data = @converter.convert(data)
  begin
    values = CSV.parse_line(data, :col_sep => @separator, :quote_char => @quote_char)

    if (@autodetect_column_names && @columns.empty?)
      @columns = values
      @logger.debug? && @logger.debug("Auto detected the following columns", :columns => @columns.inspect)
      return
    end

    decoded = {}
    values.each_with_index do |value, i|
      unless (@skip_empty_columns && (value.nil? || value.empty?))
        unless ignore_field?(i)
          field_name = @columns[i] || "column#{i + 1}"
          decoded[field_name] = transform(field_name, value)
        end
      end
    end

    event = targeted_event_factory.new_event(decoded)
    event.set(@original_field, data.dup.freeze) if @original_field
    yield event
  rescue CSV::MalformedCSVError => e
    @logger.error("CSV parse failure. Falling back to plain-text", :exception => e.class, :message => e.message, :data => data)
    yield event_factory.new_event("message" => data, "tags" => ["_csvparsefailure"])
  end
end
encode(event) click to toggle source
# File lib/logstash/codecs/csv.rb, line 166
def encode(event)
  if @include_headers
    csv_data = CSV.generate_line(select_keys(event), :col_sep => @separator, :quote_char => @quote_char, :headers => true)
    @on_event.call(event, csv_data)

    # output headers only once per codec lifecycle
    @include_headers = false
  end

  csv_data = CSV.generate_line(select_values(event), :col_sep => @separator, :quote_char => @quote_char)
  @on_event.call(event, csv_data)
end
register() click to toggle source
# File lib/logstash/codecs/csv.rb, line 120
def register
  # validate conversion types to be the valid ones.
  bad_types = @convert.values.select do |type|
    !CONVERTERS.has_key?(type.to_sym)
  end.uniq
  raise(LogStash::ConfigurationError, "Invalid conversion types: #{bad_types.join(', ')}") unless bad_types.empty?

  # @convert_symbols contains the symbolized types to avoid symbol conversion in the transform method
  @convert_symbols = @convert.each_with_object({}) { |(k, v), result| result[k] = v.to_sym }

  # if the zero byte character is entered in the config, set the value
  @quote_char = "\x00" if @quote_char == "\\x00"

  @logger.debug? && @logger.debug("CSV parsing options", :col_sep => @separator, :quote_char => @quote_char)
end

Private Instance Methods

ignore_field?(index) click to toggle source
# File lib/logstash/codecs/csv.rb, line 193
def ignore_field?(index)
  !@columns[index] && !@autogenerate_column_names
end
select_keys(event) click to toggle source
# File lib/logstash/codecs/csv.rb, line 189
def select_keys(event)
  @columns.empty? ? event.to_hash.keys : @columns
end
select_values(event) click to toggle source
# File lib/logstash/codecs/csv.rb, line 181
def select_values(event)
  if @columns.empty?
    event.to_hash.values
  else
    @columns.map {|column| event.get(column)}
  end
end
transform(field_name, value) click to toggle source
# File lib/logstash/codecs/csv.rb, line 197
def transform(field_name, value)
  CONVERTERS[@convert_symbols[field_name]].call(value)
end