使用一个过滤器配置多种类型的数据

时间:2019-07-16 11:03:22

标签: logstash logstash-grok logstash-configuration

我有多种类型的数据,我将它们放入logstash进行配置。我编写过滤器,但是该过滤器仅适用于我的某些数据,这些数据完全适合我的过滤器上下文。如何输入可以配置所有数据的过滤器?

这是我的过滤器:

filter {


   if[method]=="POST"
{
  grok {
     match => {
       '"%{DATA:user_name} \[%{HTTPDATE:time_local}\] "%{WORD:method} %{DATA:type}?%{WORD:page}=%{DATA:page_size}&%{DATA: referrer_page_size}=%{DATA:total_page} HTTP/%{NUMBER:http_version}" %{NUMBER:response_code} (?:%{NUMBER:bytes}|-) "%{DATA:connection}//%{DATA:search}/%{DATA:try2}/\?%{DATA:typeof_query}=%{DATA:looked_for}" "%{DATA:agent}" "%{DATA:http_x_forwarded_for}" "%{DATA:country}"'
     }
  }


}
}

这是我的第一个数据:

IP Adress - - [01/Jul/2019:15:36:18 +0300] "POST /search?page=1&page_size=25 HTTP/1.1" 200 78 "https://dofo.com/search/?contains=pflichtteilberatung" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0" "IP Adress" "DE"

这是我的第二个数据:

IP Adress - - [01/Jul/2019:12:46:26 +0300] "POST /search?page=64&page_size=100 HTTP/1.1" 200 3171 "https://try.com/search/?on_sale=y&price_max=3000&sale_type=1,3&extension=com&length=1-15&hyphen=n&number=n&idn=n&cdate_min=19971105&sort=cdate_a&page_s=100&page=64" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" "IP Adress" "BD"

这是我的第三个数据:

IP Adress - - [01/Jul/2019:03:09:55 +0300] "POST /search?page=1&page_size=100 HTTP/1.1" 200 2661 "https://try.com/search/?contains=real&page_s=100" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" "IP Adress" "LT"

我想在"https://try.com/search/?"值之后解析它们。对于第一个数据,我需要具有"contains"值的"pflichtteilberatung"字段 对于第二个数据,我需要具有"on_sale"值的"y"字段和具有"price_max"值的"3000"字段.. 对于第三个,我需要具有"contains"值的"real"字段和具有"page_s"值的"100"字段。

是否可以在logstash过滤器中创建它?

1 个答案:

答案 0 :(得分:0)

是的,您可以使用Logstash过滤器实现此目的,但是我怀疑查询字符串的布局将来可能会超出您的控件范围,从而导致您永远在测试和更改grok过滤器。

如果以您的第二条数据行为例,该查询字符串中有很多不同的参数,并且我假设这些参数的位置也可能有所不同。这意味着如果您希望将这些值存储在它们自己的匹配字段中,则创建多个过滤器或patterns来解决所有这些可能的变体。如果该数据突然更改,则必须更新logstash过滤器和模式,这将成为管理上的噩梦。除非捕获的是不匹配的模式,您以后还会查看这些数据,否则它们还将丢失与这些过滤器不匹配的数据。 Here是一个例子。

这不能实现您想要的结果,但是将整个查询字符串作为一个整体捕获会更容易,并且如果您将这些数据发送到类似Elasticsearch的东西中,您仍然可以过滤查询中的那些参数字符串字段。下面是我将如何做;并使用了方便的tool进行了测试。

%{IPORHOST:IP_address} %{USER:ident} %{USER:auth} \[%{HTTPDATE:time_local}\] "%{WORD:method} %{DATA:type}?page=%{DATA:page_no}&page_size=%{DATA:referrer_page_size} HTTP/%{NUMBER:http_version}" %{NUMBER:response_code} (?:%{NUMBER:bytes}|-) "%{DATA:connection}://%{DATA:search}" "%{DATA:agent}" "%{DATA:http_x_forwarded_for}" "%{DATA:country}"