2017-02-12 127 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