我使用logstash将我的Web服务器日志存储到elasticsearch引擎中。在我的logstash配置文件中,我还使用“useragent”插件来获取漂亮的用户代理信息。所以像这样的ES记录:
"message": "157.55.XXX.XXX - - [10/Oct/2016:02:24:27 +0200] "GET /handle/boreal:5621?site_name=BOREAL HTTP/1.1" 301 373 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"",
...
"agent": ""Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)""
"useragent": {
"name": "bingbot",
"os": "Other",
"os_name": "Other",
"device": "Spider",
"major": "2",
"minor": "0"
}
正如您所注意到的,此请求来自Microsoft BingBot机器人。我检查了所有记录,发现很多机器人访问我的网站:bingbot,googlebot,BaiduSpider,Yahoo! Slurp,......
我现在要从我的ES回复中排除这些请求。但我没有找到一个优雅的解决方案。由于我是ES查询的初学者,你能帮我改进我的要求吗?
{
"size": 0,
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must_not": [
{
"regexp": {
"useragent.name": ".*bot.*"
}
}
]
}
}
}
},
"aggs": {
"agent": {
"terms": {
"field": "useragent.name.raw"
}
}
}
}
使用此请求,来自bingbot,googlebot或任何其他“stuffbot”的所有请求都是排除但不是“Yahoo! Slurp”,“BaiduSpider”,... 我尝试使用更复杂的正则表达式“(。* bot。* | BaiduSpider | Yahoo!Slurp)”,但百度和雅虎的结果仍然存在于ES响应中。
答案 0 :(得分:0)
如何在must_not
内使用多个对象,这是一个数组。每个机器人一个从结果中排除。
来自文档:
must_not:所有这些条款都不匹配。相当于NOT。
这样的事情:
"filter": {
"bool": {
"must_not": [
{
"regexp": { "useragent.name": "regex for bing bot" }
},
{
"regexp": { "useragent.name": "regex for google bot" }
},
...
]
}
}
如果用户代理是静态的,您可以完全避免regexp
term
:
{
"term" : { "useragent.name": "bing bot agent name" }
}
答案 1 :(得分:0)
一旦获得必要的正则表达式,就可以将它们放入logstash并让它标记事件。这将使您的查询更短,更易于阅读和更快。
答案 2 :(得分:0)
如果您已经在使用useragent logstash filter,那么您可以从优秀且显而易见的维护ua-parser中受益。它识别了很多机器人,并将它们标记为“useragent.device:Spider”。 对弹性搜索的合适查询可以是:
{
"query": {
"bool": {
"must_not": {
"term": { "useragent.device": "Spider" }
}
}
}
}
但是,您可能需要定期更新过滤器插件,例如使用:
logstash-plugin update logstash-filter-useragent