2017-05-17 8 views
0

Ich verwende this Plugin als Ausgabe für meine Logstash Logs.jdbc Ausgabe Plugin Logstash mit UPSERT Funktion

Ich muss die Upsert-Funktion verwenden, um zu überprüfen, ob eine Zeile existiert, dann aktualisieren, wenn es nicht existiert, dann einfach hinzufügen.

Ich benutze PostgreSQL als db und es unterstützt die Verwendung von UPSERT, sehr gut beschrieben here. Als Input kommen die Logs von elasticsearch.

Das Problem mit meiner Konfiguration ist, dass ich korrekt neue Zeilen in meiner Tabelle hinzufügt, aber ein vorhandenes nicht aktualisieren kann.

Hier ist meine Konfiguration:

jdbc { 
     driver_jar_path => '/home/vittorio/Downloads/postgresql-42.1.1.jre6.jar' 
     connection_test => false 
     connection_string => 'jdbc:postgresql://127.0.0.1:5432/postgres' 
statement => [" 

     INSERT INTO userstate VALUES(?,?,?,?,?) on conflict (username) 
     do update set (business_name, iban, status, timestamp) = ('%{[resource][response_attributes][business_name]}','%{[resource][response_attributes][iban]}','%{[resource][response_attributes][status]}','%{@timestamp}') 
     where userstate.username = '%{[request][username]}';", "%{[request][username]}","%{[resource][response_attributes][business_name]}","%{[resource][response_attributes][iban]}","%{[resource][response_attributes][status]}","%{@timestamp}" 
     ] 
username => "myuser" 
password => "mypass" 
} 

Bin ich etwas falsch zu machen? dank

Antwort

0

ich manged zu, es selbst zu machen zu arbeiten, und das ist, was ich bisher getan habe:

jdbc { 
      driver_jar_path => '/home/vittorio/Downloads/postgresql-42.1.1.jre6.jar' 
      connection_test => false 
      connection_string => 'jdbc:postgresql://127.0.0.1:5432/postgres' 
      statement => [" 

      INSERT INTO userstate VALUES(?,?,?,?,?) 
      on conflict (username) 
      do update set (business_name, iban, status, timestamp) = (?,?,?,?) 
      where userstate.username = ?" 
      , "%{[request][username]}","%{[resource][response_attributes][business_name]}","%{[resource][response_attributes][iban]}","%{[resource][response_attributes][status]}","%{@timestamp}","%{[resource][response_attributes][business_name]}","%{[resource][response_attributes][iban]}","%{[resource][response_attributes][status]}","%{@timestamp}","%{[request][username]}" 

      ] 
      username => "myusername" 
      password => "mypass" 

     } 

Im Grunde habe ich die where Anweisung ? statt %{[request][username]} geändert und dann jede Karte ? mit dem entsprechenden Wert aus dem Protokoll. Ich weiß, es ist ziemlich lange nach dem Koma, aber das ist der einzige Weg, den ich gefunden habe, damit es funktioniert. Wenn jemand einen besseren Weg kennt, lass es mich wissen.

Vielen Dank

Verwandte Themen