过滤logstash输入

时间:2018-06-20 16:13:14

标签: java elasticsearch logstash

我有以下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自动处理此过滤,而从应用程序本身进行处理将是我的最后选择。

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用logstash红宝石过滤器执行类似的操作。问题在于,每当您收到一条记录(可能会带来巨大的负担)时,都必须进行查询。

https://www.elastic.co/guide/en/logstash/current/plugins-filters-ruby.html