2016-10-10 16 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

相关问题