2016-10-10 18 views
1

我有以下過濾器,其實現了我的大部分需求:(Logstash,神交)如果字段包含特定單詞,然後保存一些字符從它

過濾器{
grok { 
    match => { "message" => [ "%{IPORHOST:clientip} - %{NGUSER:user} \[%{HTTPDATE:timestamp}\] (?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest}) %{NUMBER:response} (?:%{NUMBER:bytes}|-) (-|(%{DATA:referrer})) ] } 

然而,一些(不是全部)我正在解析的日誌包含用戶在我的Apache服務器上使用的頻道的名稱。

正常日誌包括單詞 「信道」 會是這樣:


10.40.80.11 - [email protected] [03/JAN/2014:13:08:21 0000]「 GET/cgi-bin目錄/原料/ EPG?信道=彭博%20English &日期= 2016年1月3日HTTP/1.1" 200 368 「http://example.net/cgi-bin/feed/epg」 「的Mozilla/5.0」


字段 「rawrequest」 是保存在如下所示的單獨字段中:

「GET/cgi-bin目錄/飼料/ EPG頻道=彭博%20English &日期= 2016年4月4日HTTP/1.1」

問: 我如何保存頻道的名稱在一個單獨的領域考慮並非所有日誌都包含字段「rawrequest」中的單詞通道?

我已經看過很多例子,但沒有類似。將字符串與字符串其餘部分分開的字符是「&」。 我將不勝感激任何幫助。

解決方案:

match => { "request" => [ "channel=(?<Channels>[^&]+)" ] } 
+0

對於那些想要完成類似工作的人,我在我的文章中發佈了我的conf。 – Edgar

回答

0

您現有的神交創造領域。您可以使用另一個grok從那些字段創建更多字段。像

channel=(?<myField>[^&]+) 

一個正則表達式應該工作,所以你神交可能是這樣的(未經測試):

grok { 
    match => { "request" => [ "channel=(?<myField>[^&]+)" ] } 
} 

這將使你一個名爲「MyField的」新領域。根據需要重命名。

另一種選擇是使用更具體的內置模式而不是NOTSPACE來更改原始Grok模式。查看URI模式。不幸的是,該模式不會爲您創建字段,因此您必須對其進行修改。如果您將URIPATHPARAM信息放在另一個字段中,則可以對其使用kv {}過濾器,並將所有對解析到它們自己的字段中。

很多選項...

+0

謝謝您的回覆。我對Logstash有點新鮮感。你能更具體地確定我應該在哪裏放置那條線嗎? – Edgar

相關問題