Logstash открывает сокет для каждого события

#ruby #elasticsearch #logstash #logstash-configuration #elk

Вопрос:

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

 input {
   file {
    path => "./logfile.txt"
    start_position => "beginning"
    sincedb_path => "/dev/null"
   }
}
 

logfile.txt Содержит несколько событий, таких как:

событие 1n

событие 2n

событие 3n

…..

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

Код Ruby (клиент):

 filter {
        ruby {
                code => 'require "socket"
                hostname = "127.0.0.1"
                port = 7778
                s = TCPSocket.open(hostname,port)
                msg = event.get("message") #get the event
                s.write(msg) #send the event to the server
                while line=s.gets
                  puts line
               end'
        }
}
 

Logstash обрабатывает каждый журнал в файле журнала как отдельное событие и применяет фильтры к каждому из событий по одному. В моем случае Logstash применит фильтр ruby к каждому событию, что означает, что он откроет соединение с сокетом для каждого события.

Что я хочу сделать, так это открыть соединение с сокетом только один раз, а затем отправить события одно за другим на сервер python с помощью s.write(event) . Возможно ли это? Я был бы очень признателен, если бы вы могли мне помочь!

Комментарии:

1. Это ожидается, и я не думаю, что это возможно изменить, каждое событие не зависит друг от друга, поэтому logstash будет применять фильтры индивидуально к каждому событию, ваш фильтр ruby будет вызываться для каждого события. Но есть ли какая-либо причина отправлять события с использованием фильтра вместо выходных данных tcp или udp ?