我使用logstash将我的web服务器日志存储到elasticsearch中。在我的logstash配置文件中,我还使用了"useragent“插件来获取漂亮的用户代理信息。所以有这样的记录:
"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!斯库普..。
我现在尝试将这些请求排除在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“、.我尝试了更复杂的regexp "(.*bot.*|BaiduSpider|Yahoo!Slurp)“,但百度和雅虎的结果仍然出现在ES的响应中。
发布于 2017-01-19 20:03:39
如果您已经在使用用户代理logstash过滤器,那么您可以从优秀且维护良好的ua解析器中获益。它识别了许多机器人,并将它们标记为"useragent.device:Spider“。对elasticsearch的适当查询可以是:
{
"query": {
"bool": {
"must_not": {
"term": { "useragent.device": "Spider" }
}
}
}
}但是,您可能需要定期更新过滤器插件,例如:
logstash-plugin update logstash-filter-useragent发布于 2016-10-11 16:58:41
如何在must_not中使用多个对象,这是一个数组。每台机器人一台,从结果中排除。
来自文件:
must_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" }
}发布于 2016-10-11 17:54:02
一旦您有了必要的regexp,就可以将它们放入logstash中,并让它标记事件。这将使您的查询更短、更容易阅读、更快。
https://stackoverflow.com/questions/39982504
复制相似问题