2017-02-12 129 views
0

我试图建立的logstash-input-mongodb插件读取从我的数据库审计,但所有的分析策略,似乎有问题,我不知道如何自定义任何东西。logstash-input-mongodb:控制输出?

的“扁平化” parse_method相当不错的作品,但它忽略了MongoDB的对象ID,并且不会将输出除了在log_entry场的任何位置。

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

的“挖”的方法我还没有完全想通了呢。

所以我的问题:

  • 有没有办法从log_entry分析数据(见下面的例子)字段该插件输出?我试过json过滤器,但它不是json,因为它已被ruby格式化。
  • 或者,有什么办法让“扁平”方法包含对象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:ERROR logstash.filters.ruby - 红宝石发生异常:(EVAL):1:语法错误,意想不到的tINTEGER

+0

你可以分享你的logstash配置吗? – Val

+0

@Val添加了它。我尝试过很多种方式,并没有什么可以改变,所以我认为它没有那么重要。 – joniba

+0

关于第四点,您是否尝试过使用'since_ *'设置? – Val

回答

1

如果使用simple parse_method那么你可以用下面的方式yyyy-MM-dd HH:mm:ss ZZZ,您可以添加到您的日期过滤器简单地分析,时间戳。

filter { 
    date { 
    match => [ "timestamp", "yyyy-MM-dd HH:mm:ss ZZZ" ] 
    } 
} 

关于最后一点,我建议检查since_*设置,这让你保持一个什么样的已经处理了一个光标,只对来自下一logstash重新启动光标开始。

+0

所以再次,我不明白since_ *设置如何帮助防止处理古代条目?你能举一个例子吗?并且“yyyy-MM-dd HH:mm:ss Z”对于简单解析方法返回的日期不起作用(如“2017-02-12 16:30:00 UTC”)。我收到_dateparsefailure标签。 – joniba

+0

我修改了我的答案,使日期模式工作。我会跟进以来的东西 – Val

+0

谢谢,日期过滤器似乎工作。我一直搞砸了,并没有得到它的工作。我添加了一个带有“log_entry”字段的示例输出。任何想法如何我可以解析它的对象ID?无论使用哪种方式,无论我是使用简单还是扁平化,我都可以看到我将不得不学习从这个领域提取数据。 – joniba