我想制作最简单的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?
谢谢!
答案 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}