2016-10-11 10 views
0

私は、ウェブサーバーのログをelasticsearchエンジンに保存するためにlogstashを使用します。私のlogstash設定ファイルには、 "useragent"プラグインを使ってかなりのユーザーエージェント情報を取得しています。したがって、このようなESへのレコード:logstash:結果からボットを除外

"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クエリーの初心者なので、リクエストを改善するのに手伝ってくれますか? (」私は、より複雑な正規表現を試してみました ない「ヤフーSLURP」、「BaiduSpider」、...除外されますが、この要求、bingbot、Googlebotが、または任意の他の「stuffbot」からのすべての要求を使用して

{            
    "size": 0,          
    "query": {          
    "filtered": {        
     "query": {         
     "match_all": {}       
     },           
     "filter": {        
     "bool": {        
      "must_not": [       
      {         
       "regexp": {      
       "useragent.name": ".*bot.*"  
       }         
      }         
      ]          
     }          
     }           
    }           
    },            
    "aggs": {          
    "agent": {         
     "terms": {         
     "field": "useragent.name.raw"   
     }           
    }           
    }            
}            

* BOOT * * | BaiduSpider | Yahoo!Slurp) "しかし、Baiduとyahooの結果はまだESの応答に存在しています。

答えて

0

must_notの中に複数のオブジェクトを使用するとどうなりますか?結果から除外する各ボットの1つ。ドキュメントから

must_not:これらの句のすべてが一致してはいけません。 NOTと同等です。

このような何か:

"filter": {        
    "bool": {        
    "must_not": [ 
     { 
     "regexp": { "useragent.name": "regex for bing bot" }         
     }, 
     { 
     "regexp": { "useragent.name": "regex for google bot" }         
     }, 
     ... 
    ] 
    } 
} 

ユーザエージェントが静的である場合は、termと完全regexpを避けることができます。

{ 
    "term" : { "useragent.name": "bing bot agent name" } 
} 
0

必要な正規表現を持っていたら、あなたはlogstashにそれらを置くことができイベントにタグを付けるようにしてください。これにより、クエリを短く、読みやすく、速くすることができます。

+0

新しいボットが表示された場合は、このソリューションを使用して:あなたは、しかし、使用して例えば、定期的にフィルタープラグインを更新する必要があります

{ "query": { "bool": { "must_not": { "term": { "useragent.device": "Spider" } } } } } 

、私はlogstashの設定を更新し、ファイルを再解析する必要があります。それが私がElasticSearchソリューションを好む理由です。 –

+0

クエリでは、まだ新しいボットの存在を認識し、クエリを更新し、古いクエリに基づいて再パブリッシュし、データ/レポートを作成する必要があります。 logstashを使用すると、logstashでファイル全体をリロードする必要はありませんが、クエリで更新するか、logstashを使用してelasticsearchをクエリし、新しいエージェントですべてのドキュメントにタグを付けることができます。あなたのクエリーははるかに洗練されたものになるでしょう。そしてあなたはエージェントのリストを維持する1つの場所を持っています。どこでもトレードオフがあります。 –

0

既にuseragent logstash filterを使用している場合は、優秀で明らかによく維持されているua-parserから利益を得ることができます。それはたくさんのボットを認識し、それらを "useragent.device:Spider"とマークします。 elasticsearchに適したクエリは次のようになります。

logstash-plugin update logstash-filter-useragent 
関連する問題