我想要做最简单的grok过滤器,只是为了从url中提取域名,例如,为url
https://stackoverflow.com/questions/ask?title=grok%20extract%20url 我想知道结果
stackoverflow.com我试着用过滤器做到这一点
%{URIPROTO}://%{URIHOST:domain}它确实提取了stackoverflow.com,但当我使用不同的url时,例如https://www.elastic.co/,它的开头是www
结果是
www.elastic.co有没有一个过滤器可以只返回域名,而不返回www?
谢谢!
发布于 2017-10-09 00:44:23
您可以添加一个自定义模式,如下所示:
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 conf如下:
filter {
grok {
patterns_dir => ["./patterns"]
match => { "uri" => "%{URIPROTO}://(%{SUBDOMAIN}\.)?(%{SLD})" }
}
}发布于 2021-02-19 19:27:47
请定义grok pattern:
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}https://stackoverflow.com/questions/46633038
复制相似问题