我正在使用this插件作为我的logstash日志的输出。
我需要使用upsert函数来检查行是否存在然后更新,如果它不存在则只需添加。
我正在使用PostgreSQL作为db,它支持使用UPSERT,非常好描述here。作为输入,日志来自elasticsearch。
我的配置问题是我在表格中正确添加了新行但无法更新现有行。
这是我的配置:
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"
}
我做错了吗? 感谢
答案 0 :(得分:0)
我为自己的工作而努力,这就是我到目前为止所做的:
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"
}
基本上,我使用where
而不是?
更改了%{[request][username]}
语句,然后使用日志中的相应值映射每个?
。我知道,在昏迷之后这是相当长的东西,但这是我发现让它发挥作用的唯一方法。如果有人知道更好的方法,请告诉我。
谢谢