我有以下過濾器,其實現了我的大部分需求:(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>[^&]+)" ] }
對於那些想要完成類似工作的人,我在我的文章中發佈了我的conf。 – Edgar