Как обрабатывать многострочные строки в logstash с несколькими рабочими потоками?

Я хотел бы обрабатывать многострочные журналы с помощью logstash, используя несколько рабочих потоков для повышения производительности, но многострочный фильтр не работает: - https://github.com/elastic/logstash/pull/1591 - https://github.com/elastic/logstash/issues/1590

решения на данный момент:

  • использование нескольких logstash-forwarder и отправка их на другой порт лесорубов (очень плохо масштабируется: новый logstash-forwarder для каждого файла журнала с многострочными строками)
  • используя дополнительный приемник logstash с выводом redis и дополнительный индексатор logstash, который читает из redis и использует один рабочий поток (https://groups.google.com/forum/#!msg/logstash-users/fUhulxmZ0Ek/HfGev7BOhCUJ)
  • в качестве хака я попытался поставить проверку типа, которая может иметь многострочную часть вывода logstash с выводом дровосека и повторно отправить их на другой вход дровосека одного и того же экземпляра logstash (другой порт), который имеет многострочный кодек, но он их не обрабатывает
  • Я также мог бы использовать rabbitMQ, который считывает события, но тогда я должен объединить многострочные сообщения, прежде чем они будут отправлены в rabbitMQ (как мне это сделать?)
  • rsyslog также может отправлять журналы, но для этого требуется специальный формат многострочных журналов, и он не работает с регулярными выражениями (https://serverfault.com/questions/622035/how-do-i-configure-rsyslog-to-сделка-с-mysql-медленный-запрос-журнал-многострочные-сообщения)

Очевидно, что ни один из них не хорош, так что есть ли у кого-нибудь достойное решение для этого?


person Balazs Varhegyi    schedule 16.03.2015    source источник
comment
параметр stream_identity многострочного фильтра не помогает?   -  person Magnus Bäck    schedule 16.03.2015
comment
Привет @MagnusBäck, к сожалению, многострочный фильтр не работает с несколькими рабочими потоками, поэтому я не могу использовать этот параметр. Я спросил и оценил время для исправления, но все еще жду ответа. (github.com/elastic/logstash/pull/1591#issuecomment-81541730)   -  person Balazs Varhegyi    schedule 16.03.2015
comment
Вы нашли правильный ответ (вы не можете). Вы можете рассмотреть возможность запуска двух индексаторов logstash, одного для многострочного и одного (несколько рабочих) для всего остального.   -  person Alain Collins    schedule 16.03.2015
comment
@BalazsVarhegyi, вы нашли решение для этого? Я сталкиваюсь с этой точной проблемой прямо сейчас.   -  person jmreicha    schedule 26.03.2015
comment
В итоге я использовал отдельный logstash для обработки многострочного кода. Он настроен на использование одного рабочего потока и использует многострочный фильтр. Если производительность по-прежнему не в порядке, вы можете добавить больше logstash, который использует только один рабочий поток. Затем, когда кто-то это исправит, мы удалим эти дополнительные экземпляры logstash. (Я думаю, что этой проблеме не уделяется столько внимания, сколько нужно, но приятно слышать, что я не одинок :))   -  person Balazs Varhegyi    schedule 26.03.2015


Ответы (4)


Альтернативой может быть использование log-courier вместо logstash-forwarder. Он выполняет многострочное выполнение перед отправкой в ​​logstash:

https://github.com/driskell/log-courier/blob/master/docs/codecs/Multiline.md

Есть запрос на поддержку этого и в logstash-forwarder:

https://github.com/elastic/logstash-forwarder/issues/309

Мне любопытно, как вы сделали, чтобы отправить многострочные журналы в конкретный однопоточный логсташ, а остальные - в остальные?

person Pedro Andujar    schedule 28.05.2015
comment
Я запустил второй logstash, который использует другой порт, и второй logstash-forwarder, который отправляет на этот порт. Например: gist.github.com/varh1i/6e971d3443453b421f5f - person Balazs Varhegyi; 28.05.2015

Есть еще альтернатива:

  1. Выполняйте многострочную обработку непосредственно во входных данных, используя кодек multiline. Очевидно, что этот бит будет однопоточным для каждого входа.

  2. Затем используйте остальные фильтры как обычно. Это будет многопоточным для каждого работника фильтра, если было предоставлено -w <threads>.

канал Logstash Модель потока задокументирована следующим образом:

Модель потока в Logstash в настоящее время:

input threads | filter worker threads | output worker
person haylem    schedule 21.08.2015

В итоге я использовал отдельный logstash для обработки многострочного кода. Он настроен на использование одного рабочего потока и использует многострочный фильтр. Если производительность по-прежнему не в порядке, вы можете добавить больше logstash, который использует только один рабочий поток. Затем, когда кто-то это исправит, мы удалим этот лишний экземпляр logstash.

person Balazs Varhegyi    schedule 26.03.2015

Попробуйте что-то вроде,

 multiline {
        pattern => "(Stack trace:)|(^#.+)|(^\"\")|(  thrown+)|(^\s)"
        what    => "previous"
      }

Я использую его для фатальных ошибок Php.

person Shoaib    schedule 18.02.2016