2016-03-19 25 views
2

logstash jdbc plugins ile veritabanı isteğinde bulunmaya çalışıyorum ve logstash csv plugin numaralı başlıklarla birlikte bir csv çıktı dosyası döndürüyorum.Logstash - csv çıkış üstbilgileri

Logstash belgelerine çok zaman harcadım ama hala bir noktayı kaçırıyorum.

Aşağıdaki logstash yapılandırmasıyla, sonuçlar her satır için üstbilgileri olan bir dosya verir. Üstbilgiler yapılandırmasında yalnızca ilk satırı eklemek için bir yol bulamadım.

Çok takdir edilmesine yardımcı olur.

Çıktı dosyası

_object$id;_object$name;_object$type;nb_surveys;csat_score 
2;Jeff Karas;Agent;2;2 
_object$id;_object$name;_object$type;nb_surveys;csat_score 
3;John Lafer;Agent;2;2;2;2;$2;2 
_object$id;_object$name;_object$type;nb_surveys;csat_score 
4;Michele Fisher;Agent;2;2 
_object$id;_object$name;_object$type;nb_surveys;csat_score 
5;Chad Hendren;Agent;2;78 

dosyası: Basit-out.conf

input { 
    jdbc { 
     jdbc_connection_string => "jdbc:postgresql://localhost:5432/postgres" 
     jdbc_user => "postgres" 
     jdbc_password => "postgres" 
     jdbc_driver_library => "/tmp/drivers/postgresql/postgresql_jdbc.jar" 
     jdbc_driver_class => "org.postgresql.Driver" 
     statement_filepath => "query.sql" 
    } 
} 
output { 
    csv { 
     fields => ["_object$id","_object$name","_object$type","nb_surveys","csat_score"] 
     path => "output/%{team}/output-%{team}.%{+yyyy.MM.dd}.csv" 
     csv_options => { 
     "write_headers" => true 
     "headers" =>["_object$id","_object$name","_object$type","nb_surveys","csat_score"] 
     "col_sep" => ";" 
     } 
    } 
} 

Teşekkür

+0

Write_headers öğesini false olarak ayarlarsanız ne olur? – JLB

+0

Genel olarak bu imkansızdır, çünkü logstash ilişkisel olmayan veri kümesini bekler, burada her satırın sütunları farklı olabilir. Tarlaların aynı olduğu konusunda endişeleniyor olsanız, sonuçta eski iyi "Array # uniq" ile giderdim. İkincisi, tam olarak 10 sembol koduyla istediğiniz şeyi verecektir. – mudasobwa

+0

@JLB write_headers öğesini ayarlarsam, çıktı dosyam ilk satırda bile hiç bir başlık döndürmez. – frognonus

cevap

1

Logstash kavramı yok çünkü çıktıda birden başlıklarını alıyorsanız nedeni budur Olaylar arasında global/paylaşılmış durum, her bir öğe ayrı ayrı ele alınır, böylece CSV çıktı eklentisi her çalıştığında ilk gibi davranır ve başlıkları yazar.

Aynı sorunu yaşadım ve logstash başlangıç ​​zamanında bazı kodları çalıştırmak için yakut filtresinin init seçeneğini kullanarak bir çözüm buldum.

A,B,C 
1,2,3 
4,5,6 
7,8,9 

:

echo "1,2,3\n4,5,6\n7,8,9" | ./bin/logstash -f csv-headers.conf 

Bu içeriğe sahip bir output.csv dosyasını alacak: o yapılandırma ile Logstash çalıştırırsanız

# csv-headers.conf 

input { 
    stdin {} 
} 
filter { 
    ruby { 
     init => " 
      begin 
       @@csv_file = 'output.csv' 
       @@csv_headers = ['A','B','C'] 
       if File.zero?(@@csv_file) || !File.exist?(@@csv_file) 
        CSV.open(@@csv_file, 'w') do |csv| 
         csv << @@csv_headers 
        end 
       end 
      end 
     " 
     code => " 
      begin 
       event['@metadata']['csv_file'] = @@csv_file 
       event['@metadata']['csv_headers'] = @@csv_headers 
      end 
     " 
    } 
    csv { 
     columns => ["a", "b", "c"] 
    } 
} 
output { 
    csv { 
     fields => ["a", "b", "c"] 
     path => "%{[@metadata][csv_file]}" 
    } 
    stdout { 
     codec => rubydebug { 
      metadata => true 
     } 
    } 
} 

: Burada

örnek logstash yapılandırma olduğunu Bu aynı zamanda iş parçacığı güvenlidir, çünkü kodu sadece başlangıçta çalıştırır, böylece birden çok wo kullanabilirsiniz rkers.

Umut eder!

+0

Günümü sen yaptın! Çok teşekkürler @xmarcos .. Örneğinizle gerçekten çok yardımcı oluyor. – frognonus