Как отфильтровать данные с помощью Logstash перед сохранением проанализированных данных в Elasticsearch - PullRequest
0 голосов
/ 19 февраля 2019

Я понимаю, что Logstash предназначен для агрегирования и обработки журналов.У меня есть журналы NGIX, и я настроил конфигурацию Logstash следующим образом:

filter {
 grok {
   match => [ "message" , "%{COMBINEDAPACHELOG}+%{GREEDYDATA:extra_fields}"]
   overwrite => [ "message" ]
 }
 mutate {
   convert => ["response", "integer"]
   convert => ["bytes", "integer"]
   convert => ["responsetime", "float"]
 }
 geoip {
   source => "clientip"
   target => "geoip"
   add_tag => [ "nginx-geoip" ]
 }
 date {
   match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
   remove_field => [ "timestamp" ]
 }
 useragent {
   source => "agent"
 }
}

output {
 elasticsearch {
   hosts => ["localhost:9200"]
   index => "weblogs-%{+YYYY.MM}"
   document_type => "nginx_logs"
 }
 stdout { codec => rubydebug }
}

Это позволит проанализировать неструктурированные журналы в структурированную форму данных и сохранить данные в ежемесячные индексы.

Я обнаружил, что большинство журналов были предоставлены роботами / веб-сканерами.В python я бы отфильтровал их по:

browser_names = browser_names[~browser_names.str.\
                              match('^[\w\W]*(google|bot|spider|crawl|headless)[\w\W]*$', na=False)]

Однако я хотел бы отфильтровать их с помощью Logstash, чтобы я мог сэкономить много дискового пространства на сервере Elasticsearch.Есть способ сделать это?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Спасибо LeBigCat за щедрую подсказку.Я решил эту проблему, добавив следующее под фильтром:

 if [browser_names] =~ /(?i)^[\w\W]*(google|bot|spider|crawl|headless)[\w\W]*$/ {
   drop {}
 }

флаг (? I) для сопоставления без учета регистра.

0 голосов
/ 19 февраля 2019

В вашем фильтре вы можете запросить сброс (https://www.elastic.co/guide/en/logstash/current/plugins-filters-drop.html). Поскольку вы уже получили свой паттерн, он должен быть довольно быстрым;)

...