2014-03-24 68 views
1

我有一個elasticsearch索引,我正在使用索引一組文檔。使用logstash解析csv文件

這些文檔最初是採用csv格式,我正在使用logstash來解析這些文件,因爲它具有強大的正則表達式工具,如grok。

我的問題是,我有大意如下的東西

field1,field2,field3,[email protected]#[email protected]#[email protected] 

在過去的專欄中,我有鍵值對通過#分離鍵@值,可以有任意數量的這些

是有沒有辦法對我來說,使用logstash來解析這一點,並把它保存的最後一列中elasticsearch以下JSON(或其他一些搜索的格式),所以我能夠搜索到它

[ 
    {"key" : number, "value" : number}, 
    {"key" : number, "value" : number}, 
    ... 
] 

回答

2

首先,您可以使用CSV過濾器解析出最後一列。 然後,您可以使用Ruby過濾器編寫自己的代碼來執行您所需的操作。

input { 
    stdin { 
    } 
} 

filter { 
    ruby { 
     code => ' 
      b = event["message"].split("#"); 
      ary = Array.new; 
      for c in b; 
       keyvar = c.split("@")[0]; 
       valuevar = c.split("@")[1]; 
       d = "{key : " << keyvar << ", value : " << valuevar << "}"; 
       ary.push(d); 
      end; 
      event["lastColum"] = ary; 
     ' 
    } 
} 


output { 
    stdout {debug => true} 
} 

通過該過濾器,當我輸入

1 @ 10#2 @ 20

輸出是

"message" => "[email protected]#[email protected]", 
    "@version" => "1", 
"@timestamp" => "2014-03-25T01:53:56.338Z", 
"lastColum" => [ 
    [0] "{key : 1, value : 10}", 
    [1] "{key : 2, value : 20}" 
] 

FYI。希望這可以幫到你。

+0

謝謝,我不知道ruby過濾器的存在,我只是想在Ruby中編寫我自己的過濾器,並用它來代替,但這應該很好地實現。 –