#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 ?