Индексирование журналов с помощью Elasticsearch Logstash (с использованием скрипта предварительной обработки Python)

У меня проблема с Elasticsearch Logstash. Моя цель — автоматически отправлять журналы в elasticsearch с помощью logstash.

Мои необработанные журналы выглядят так:

2016-09-01T10:58:41+02:00 INFO (6):     165.225.76.76   entreprise1 [email protected]    POST    /application/controller/action Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko    {"getid":"1"}   86rkt2dqsdze5if1bqldfl1
2016-09-01T10:58:41+02:00 INFO (6):     165.225.76.76   entreprise2 [email protected]    POST    /application/controller2/action2    Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko   {"getid":"2"}   86rkt2rgdgdfgdfgeqldfl1
2016-09-01T10:58:41+02:00 INFO (6):     165.225.76.76   entreprise3 [email protected]    POST    /application/controller2/action2    Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko   {"getid":"2"}

Проблема в том, что я не хочу вставлять свои логи в эту форму. Я хочу использовать скрипт предварительной обработки на python, чтобы преобразовывать свои данные перед внедрением в Elastic с помощью logstash.
Сначала я хотел выполнять вход в elasticsearch только с помощью скрипта python. Но у меня есть огромное количество журналов, разделенных на множество папок и файлов, которые постоянно обновляются, поэтому я думаю, что гораздо эффективнее использовать logstash или filebeat. Я пытался использовать фильтр filebeat и gork (недостаточно для моего случая), но я думаю, что невозможно использовать сценарий предварительной обработки перед ведением журнала.

Логи должны выглядеть так в конце скрипта python:

{"page": "/application/controller/action", "ip": "165.225.76.76", "browser": "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko", "action": "action", "client": "entreprise1", "email": "[email protected]", "feature": "application_controller_action", "time": "2016-09-01 10:58:41", "method": "POST", "controller": "controller", "application": "application"} 
{"page": "/application/controller2/action2", "ip": "165.225.76.76", "browser": "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko", "action": "action2", "client": "entreprise2", "email": "[email protected]", "feature": "application_controller2_action2", "time": "2016-09-01 10:58:41", "method": "POST", "controller": "controller2", "application": "application"} 
{"page": "/application3/controller/action3", "ip": "165.225.76.76", "browser": "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko", "action": "action3", "client": "entreprise3", "email": "[email protected]", "feature": "application_controller3_action3", "time": "2016-09-01 10:58:41", "method": "POST", "controller": "controller3", "application": "application"}

Я борюсь с реализацией скрипта python в фильтре logstash. Я знаю, что это можно реализовать, но в основном это делается с помощью скрипта ruby ​​(см.: https://www.elastic.co/guide/en/logstash/current/plugins-filters-ruby.html)

1) Как вы думаете, можно ли решить мою проблему с помощью logstash?

2) Если да, мой скрипт python должен принимать необработанную строку журнала в качестве входных данных и строку в формате json в качестве вывода?

3) Когда строка журнала добавляется в файл журнала, каждый раз заново вставляется весь файл, как я могу справиться с этим?

4) Как вы думаете, возможно ли это сделать с помощью filebeat? И, по-вашему, что лучше для моего случая?

На данный момент мой файл журнала конфигурации выглядит следующим образом:

input {
  file {
    path => "/logpath/logs/*/*.txt"
    start_position => "beginning"
  }
}

filter {
  # Here is where I should use my script to transform my logs into my json needed format
  date {
    match => ["time", "YYYY-MM-dd HH:mm:ss" ]
  }

  geoip {
    source => "ip"
    target => "geoip"
  }


}

output {
  stdout  {
    codec => dots {}
  }

  elasticsearch {
    index => "logs_index"
    document_type => "logs"
    template => "./logs_template.json"
    template_name => "logs_test"
    template_overwrite => true
  }

}

Я действительно хочу заранее поблагодарить всех людей, которые помогут мне и рассмотрят мою просьбу.

Дмитрий

PS: Извините за синтаксис, английский не мой основной язык.


person denis jardot    schedule 18.06.2018    source источник


Ответы (1)


Стандартный способ преобразования журналов в формат json — использование фильтров grok,json в конфигурации logstash. а чтобы уменьшить нагрузку на Logstash для обработки журналов, вместе с вашей конфигурацией можно использовать filebeat.

Следовательно, лучшая конфигурация, которая может решить эту проблему, — это filebeat->logstash->Elasticsearch stack.

Вам не нужен скрипт Python, вместо этого используйте filebeat, чтобы собрать все журналы из определенного места и перенаправить их в logstash.

Установите filebeat на сервер, где собираются все логи, будет хорошо, если вы направите все логи в определенную папку. Сначала установите filebeat, а затем настройте конфигурацию для пересылки журналов в logstash.

Вот конфигурация filebeat:

filebeat:
  prospectors:
    -
      paths:
        - "*log_path_of_all_your_log_files*"
      input_type: log
      json.message_key: statement
      json.keys_under_root: true

  idle_timeout: 1s
  registry_file: /var/lib/filebeat/registry
output:

  logstash:
    hosts: ["*logstash-host-ip:5044*"]
    worker: 4
    bulk_max_size: 1024
shipper:
logging:
  files:
    rotateeverybytes: 10485760 # = 10MB
    level: debug

Теперь здесь, наряду с вашей конфигурацией logstash, вам нужен фильтр GROK для преобразования ваших журналов в формат json (внесите изменения в файл конфигурации logstash), а затем перенаправьте его в кибану elasticsearch или куда хотите.

person Ayush Verma    schedule 19.06.2018
comment
Большое спасибо за ваш ответ, я никогда не благодарю за использование как logstash, так и filebeat, я попробую. Моя проблема с gork заключается в том, что я не знаю, как создать настраиваемое поле, подобное тому, которое я назвал функцией. Это поле представляет собой смесь трех других полей, присоединенных к _ (application_controller_action). Можно ли сделать что-то подобное? Я уже просил людей помочь мне с регулярным выражением gork, когда пытался использовать filebeat, вот мой пост (stackoverflow.com/questions/50816580/) Спасибо - person denis jardot; 19.06.2018
comment
Я также хотел знать, в чем интерес использования обоих? Что logstash приносит, а filebeat - нет? И наоборот ? - person denis jardot; 19.06.2018
comment
Кроме того, в моем случае недостаточно только использования gork. Действительно, мой скрипт на питоне тоже используется как очиститель поля. У меня много обработки, которая изменяет страницу поля (/application/controller/action) в соответствии с тем, что у меня есть в части приложения, части контроллера и действии. И я думаю, что весь этот процесс не может быть выполнен в фильтре Gork. - person denis jardot; 19.06.2018
comment
Я понимаю, что фильтр grok может быть сложным, но, поскольку вы используете logstash, вы должны попытаться максимально использовать его функции. При этом да, можно смешивать определенные поля и объединять их в одно. Я перейду по предоставленной вами ссылке и предложу изменения. - person Ayush Verma; 19.06.2018
comment
Уже некоторое время ведутся споры относительно logstash и filebeat, потому что в конце концов оба пересылают журналы. Но это сводится к производительности обоих. Filebeat предпочтительнее logstash для пересылки, поскольку он легкий, поддерживает шифрование SSL и TLS, поддерживает обратное давление с хорошим встроенным механизмом восстановления и чрезвычайно надежен. Затем logstash выполнит операцию форматирования журналов, перенаправленных с помощью filebeat, и отобразит их в кибане или любом другом графическом интерфейсе. - person Ayush Verma; 19.06.2018
comment
Что ж, я предполагаю, что ваш скрипт на Python отлично справляется со своей задачей. Но grok в сочетании с другими фильтрами может с легкостью выполнять аналогичную задачу. В любом случае, я изо всех сил старался указать вам правильное направление и лучший стек, которому можно следовать. вы можете исследовать дальше. - person Ayush Verma; 19.06.2018