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