用grok提取域名

时间:2017-10-08 15:52:03

标签: regex elasticsearch logstash logstash-grok

我想制作最简单的grok过滤器,只是为了从url中提取域名 例如,对于网址

do shell script

我想得到结果

https://stackoverflow.com/questions/ask?title=grok%20extract%20url 

我尝试使用过滤器

stackoverflow.com

它确实提取了我stackoverflow.com,但是当我在开始时使用一个不同的网址时有www 例如 https://www.elastic.co/
结果是

%{URIPROTO}://%{URIHOST:domain}

是否有一个过滤器可以单独返回域名,没有www?

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以添加如下自定义模式:

SLD ([a-z0-9-]+.[a-z]{2,63})

这为您提供了没有子域名的二级域名。您还可以为unicode域名添加如下所示的xn--模式:

SLD ((xn--)?[a-z0-9-]+\.[a-z]{2,63})

请检查如何向logstash documentation添加自定义模式。然后,现在,您可以使用此自定义模式,如下所示:

%{URIPROTO}://(%{WORD:SUBDOMAIN}\.)?(%{SLD})

对于%{WORD:SUBDOMAIN}这部分,您还可以在自定义模式中编写另一个正则表达式,如下所示:

SUBDOMAIN ([a-z0-9-]{1,63})

最后,您的模式文件如下:

SLD ((xn--)?[a-z0-9-]+\.[a-z]{2,63})
SUBDOMAIN ([a-z0-9-]{1,63})

你的logstash就像这样:

filter {
  grok {
    patterns_dir => ["./patterns"]
    match => { "uri" => "%{URIPROTO}://(%{SUBDOMAIN}\.)?(%{SLD})" }
  }
}

答案 1 :(得分:0)

请定义 grok 模式:

HOSTNAME \b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b)

并使用它:

%{URIPROTO}://%{HOSTNAME:domain}