diff --git a/lib/logstash/outputs/csv.rb b/lib/logstash/outputs/csv.rb index 644a076..9e3916c 100644 --- a/lib/logstash/outputs/csv.rb +++ b/lib/logstash/outputs/csv.rb @@ -26,17 +26,28 @@ class LogStash::Outputs::CSV < LogStash::Outputs::File # may not make the values safe in your spreadsheet application config :spreadsheet_safe, :validate => :boolean, :default => true + # Optional headers to add to the CSV file once it's generated. + config :headers, :validate => :string + public def register super - @csv_options = Hash[@csv_options.map{|(k, v)|[k.to_sym, v]}] + @csv_options = Hash[@csv_options.map{|(k, v)|[k.to_sym, v]}] + + if headers + @csv_options[:headers] = headers + end end public def receive(event) path = event.sprintf(@path) + + @csv_options[:write_headers] = !File.exist?(path) || File.zero?(path) + fd = open(path) + csv_values = @fields.map {|name| get_value(name, event)} fd.write(csv_values.to_csv(@csv_options)) diff --git a/spec/outputs/csv_spec.rb b/spec/outputs/csv_spec.rb index 091ec46..6623929 100644 --- a/spec/outputs/csv_spec.rb +++ b/spec/outputs/csv_spec.rb @@ -315,4 +315,34 @@ end end + describe "can turn on headers" do + tmpfile = Tempfile.new('logstash-spec-output-csv') + config <<-CONFIG + input { + generator { + add_field => ["foo","1+1", "baz", "=1+1"] + count => 2 + } + } + output { + csv { + path => "#{tmpfile.path}" + spreadsheet_safe => false + fields => ["foo", "baz"] + headers => "header1,header2" + } + } + CONFIG + + agent do + lines = CSV.read(tmpfile.path, :headers => true) + print lines + insist {lines.headers[0]} == "header1" + insist {lines.headers[1]} == "header2" + insist {lines.count} == 2 + insist {lines[0][0]} == "1+1" + insist {lines[0][1]} == "=1+1" + end + end + end