logstash:从结果

时间:2016-10-11 16:48:38

标签: elasticsearch logstash bots

我使用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响应中。

3 个答案:

答案 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