我有以下logstash管道,该管道基本上使用logstash的jdbc输入插件从Oracle数据库中获取记录,并将它们输出到elasticsearch索引中。
input {
jdbc {
id => "nouvelle-demande"
jdbc_connection_string => "${JDBC_CONNECTION_STRING}"
jdbc_user => "${JDBC_USER}"
jdbc_password => "${JDBC_PASSWORD}"
jdbc_driver_library => "${JDBC_DRIVER_LIBRARY}"
jdbc_driver_class => "${JDBC_DRIVER_CLASS}"
jdbc_validate_connection => true
jdbc_fetch_size => 512
clean_run => "${CLEAN_RUN}"
schedule => "${NOUVELLE_DEMANDE_SCHEDULE}"
statement_filepath => "/usr/share/logstash/query/nouvelle-demande.sql"
use_column_value => true
tracking_column => "id"
last_run_metadata_path => "/usr/share/logstash/nouvelle-demande-logstash_jdbc_last_run"
tags => "nouvelle-demande"
}
}
output {
if "nouvelle-demande" in [tags] {
elasticsearch {
id => "nouvelle-demande-output"
hosts => "elasticsearch:9200"
index => "nouvelle-demande"
document_type => "demande"
document_id => "%{id}"
}
}
}
然后,elasticsearch索引被Java应用程序用作处理队列。处理完索引后,Java应用程序将从索引中删除该索引,然后将其添加到另一个Elasticsearch索引中,该索引基本上充当已处理索引的日志。此日志索引永远不会删除,它是治疗历史记录。
我想做的是让logstash忽略历史索引中已经存在的索引。基本上,我在Java应用程序中的处理循环会检查索引是否已在历史索引中,如果已删除,则会跳过它,但是我的队列仍然包含所有已处理的索引,这使处理变得blo肿,因为队列一直在获取每当我的logstash计划运行时,它就会更大。
我已经看过logstash的elasticsearch filter plugin以及其他可用的过滤器插件,但是似乎没有一个插件能够实现我想做的事情。谷歌搜索也做了很多,但是找不到适合我需要的东西,我想这是非常规的。
两个索引之间的数据模型并不完全相同,但是两个索引中的id都相同。
注意:是的,我可以在Java应用程序本身中进行过滤,但是我希望由logstash自动处理此过滤,而从应用程序本身进行处理将是我的最后选择。
谢谢。
答案 0 :(得分:1)
您可以使用logstash红宝石过滤器执行类似的操作。问题在于,每当您收到一条记录(可能会带来巨大的负担)时,都必须进行查询。
https://www.elastic.co/guide/en/logstash/current/plugins-filters-ruby.html