logstash-input-mongodb:控制输出?

时间:2017-02-12 17:17:13

标签: ruby mongodb logstash

我正在尝试设置logstash-input-mongodb插件来读取我的数据库中的审核,但所有解析策略似乎都有问题,我看不到如何自定义任何内容。

“flatten”parse_method工作得非常好,但它忽略了mongodb对象ID,除了在log_entry字段外,它们不会输出它们。

“简单”parse_method包括对象ID,但以我无法弄清楚如何使用日期过滤器解析的方式输出日期(例如,“2017-02-12 16:30:00 UTC”)。然后,在没有适当的时间戳的情况下,插件似乎自己生成时间戳,这与当前时间无关(例如,在2022年)。

我还没有弄清楚“挖掘”方法。

所以我的问题:

  • 有没有办法解析插件输出的log_entry(参见下面的示例)字段中的数据?我已经尝试了json过滤器,但它不是json,因为它是ruby格式的。
  • 或者,有没有办法让“flatten”方法包含对象ID?
  • 或者,有没有什么可以通过“简单”的方法来正确格式化mongodb ISODate字段?
  • 有没有办法阻止插件从一开始就读取数据(我只想把最后一天推到logstash中)?

可以使用任何配置进行复制,这是我的基本配置:

input {
  mongodb {
    uri => 'mongodb://localhost:27017/test'
    placeholder_db_dir => '/elk/logstash-mongodb/'
    placeholder_db_name => 'logstash_sqlite.db'
    collection => 'auditcommunications'
    batch_size => 1000
    parse_method => "flatten"
  }
}

filter {
  date {
    match => [ "timestamp", "ISO8601" ]
  }
}

output {
    stdout { codec => rubydebug }
}

示例数据包括log_entry:

{
        "audit-id" => "58a2edc916e057270065fa74",
         "created" => "2017-02-14T11:45:13Z",
            "type" => "mongodb-audit",
      "audit-type" => "PaymentAudit",
        "mongo_id" => "58a2edc916e057270065fa74",
       "expiresAt" => "2017-05-15T11:45:13Z",
     "lastUpdated" => "2017-02-14T11:45:13Z",
      "@timestamp" => 2017-02-14T11:45:13.000Z,
       "log_entry" => "{\"_id\"=>BSON::ObjectId('58a2edc916e057270065fa74'), \"order\"=>BSON::ObjectId('a8a2f205790858970046aa59'), \"_type\"=>\"PaymentAudit\", \"lastUpdated\"=>2017-02-14 11:45:13 UTC, \"created\"=>2017-02-14 11:45:13 UTC, \"payment\"=>BSON::ObjectId('58a2edc02eafcd560101ee5f'), \"organization\"=>BSON::ObjectId('56edde0ba33e1c03ff54a5ec'), \"status\"=>\"succeeded\", \"context\"=>{\"type\"=>\"order\", \"id\"=>BSON::ObjectId('58a2e205790852270046ab59')}, \"expiresAt\"=>2017-05-15 11:45:13 UTC, \"__v\"=>0}",
         "logdate" => "2017-02-14T11:45:13+00:00",
             "__v" => 0,
        "@version" => "1",
    "context_type" => "order",
          "status" => "succeeded",
       "timestamp" => "2017-02-14T11:45:13Z"
}

如何从上面的log_entry字段中提取组织?

我尝试了以下内容:

filter {
  ruby {
    code => "event.set('organization', eval(event.get('[log_entry]')))"
  }
}

但是这会抛出一个rubyexception:错误logstash.filters.ruby - 发生了Ruby异常:(eval):1:语法错误,意外的tINTEGER

1 个答案:

答案 0 :(得分:1)

如果您使用<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:keepScreenOn="true" > parse_method,则可以使用可添加到日期过滤器的以下模式simple轻松解析时间戳。

yyyy-MM-dd HH:mm:ss ZZZ

关于最后一点,我建议检查filter { date { match => [ "timestamp", "yyyy-MM-dd HH:mm:ss ZZZ" ] } } 设置,这些设置允许您保留已处理的内容的光标,并且只在下次重新启动logstash时从该光标开始。