У меня проблема с 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: Извините за синтаксис, английский не мой основной язык.