如何为Logstash输入MongoDB类型

时间:2014-12-01 14:52:13

标签: mongodb elasticsearch logstash

我知道我们可以输入文件,然后输出到mongo数据库。但我在我的mongodb中有一个集合,我希望将其作为输入,以便我可以将它与ES一起使用。这可能吗? 谢谢。

4 个答案:

答案 0 :(得分:4)

我遇到了类似的问题, logstash-input-mongodb 插件很好,但是它非常有限,似乎也不再得到维护,因此,我选择了 logstash-integration-jdbc 插件。

我已按照以下步骤将MongoDB集合与ES同步:

首先,我已经下载了由DBSchema开发的MongoDB的JDBC驱动程序,您可以找到here

我准备了一个自定义Dockerfile 以集成驱动程序和插件,如下所示:

FROM docker.elastic.co/logstash/logstash:7.9.2

RUN mkdir /usr/share/logstash/drivers
COPY ./drivers/* /usr/share/logstash/drivers/

RUN logstash-plugin install logstash-integration-jdbc
RUN logstash-plugin install logstash-output-elasticsearch

我已经配置了一个查询,该查询每30秒执行一次,并查找插入时间戳比上一个查询的时间戳晚的文档(由参数:sql_last_value 提供)

input {
  jdbc {
    jdbc_driver_library => "/usr/share/logstash/drivers/mongojdbc2.3.jar"
    jdbc_driver_class => "com.dbschema.MongoJdbcDriver"
    jdbc_connection_string => "jdbc:mongodb://devroot:devroot@mongo:27017/files?authSource=admin"
    jdbc_user => "devroot"
    jdbc_password => "devroot"
    schedule => "*/30 * * * * *"
    statement => "db.processed_files.find({ 'document.processed_at' : {'$gte': :sql_last_value}},{'_id': false});"
  }
}

output {
  stdout {
    codec => rubydebug
  }
  elasticsearch {
    action => "create"
    index => "processed_files"
    hosts => ["elasticsearch:9200"]
    user => "elastic"
    password => "password"
    ssl => true
    ssl_certificate_verification => false
    cacert => "/etc/logstash/keys/certificate.pem"
  }
}

希望它能对某人有所帮助

答案 1 :(得分:3)

您可以设置river将数据从MongoDB提取到Elasticsearch。

请参阅此处的说明 - http://www.codetweet.com/ubuntu-2/configuring-elasticsearch-mongodb/

答案 2 :(得分:1)

显然,简短的回答是“否”,在Logstash中无法从数据库获得输入。

修改

@elssar谢谢你的回答:

  

实际上,有一个用于logstash的第三方mongodb输入 -   github.com/phutchins/logstash-input-mongodb - elssar

答案 3 :(得分:1)

我尝试了 Sergio Sánchez Sánche's solution suggestion 并发现了以下更新和改进:

input {
  jdbc {
    jdbc_driver_library => "/usr/share/logstash/drivers/mongojdbc3.0.jar"
    jdbc_driver_class => "com.dbschema.MongoJdbcDriver"
    jdbc_connection_string => "jdbc:mongodb://devroot:devroot@mongo:27017/files?authSource=admin"
    jdbc_user => "devroot"
    jdbc_password => "devroot"
    schedule => "*/30 * * * * *"
    statement => "db.processed_files.find({ 'document.processed_at' : {'$gte': new ISODate(:sql_last_value)}},{'_id': false});"
  }
}

output {
  stdout {
    codec => rubydebug
  }
  elasticsearch {
    action => "update"
    doc_as_upsert => true
    document_id => "%{[document][uuid]}"
    index => "processed_files"
    hosts => ["elasticsearch:9200"]
    user => "elastic"
    password => "password"
    ssl => true
    ssl_certificate_verification => false
    cacert => "/etc/logstash/keys/certificate.pem"
  }
}

说明:

  • Mongodb 中的日期比较不得不使用新的 ISODate 来转换 :sql_last_value

  • 我想使用“更新”而不是“创建”来覆盖 更新的情况。部分输入的查询结果是 包含在“文件”中。假设您有一个具有唯一值的字段 “uuid”,你必须用它来识别文档,因为 Mongodb 的 无论如何都不支持“_id”。

  • 如果您有任何包含“_id”的嵌入文档,您也必须将其排除,例如

    statement => "db.profiles.find({'updatedAt' : {'$gte': new ISODate(:sql_last_value)}}, {'_id': false, 'embedded_doc._id': false}});"