Отправка данных в logstash по tcp

У меня возникают некоторые проблемы с отправкой данных журнала в мой экземпляр журнала logstash из простого приложения Java. В моем случае я стараюсь избегать использования log4j logback и вместо этого пакетировать события json в отдельных строках через необработанный сокет tcp. Причина этого в том, что я хочу отправить данные через лямбда-функцию aws в logstash, что означает, что сохранение журналов на диск может не сработать.

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

input {
  tcp {
        port => 5400
        codec => json
  }
}
filter{
  json{
    source => "message"
  }
}
output {
   elasticsearch {
      host => "localhost"
      protocol => "http"
      index => "someIndex"
   }
}

Мой код Java прямо сейчас просто открывает сокет tcp для сервера logstash и напрямую отправляет событие.

Socket socket = new Socket("logstash-hostname", 5400);
DataOutputStream os = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
os.writeBytes("{\"message\": {\"someField\":\"someValue\"} }");
os.flush();
socket.close();

Приложение правильно подключается к хосту logstash (если logstash не запущен, при подключении генерируется исключение), но в нашем кластере ES не отображаются события. Мы очень ценим любые идеи о том, как это сделать!

Я не вижу соответствующих журналов в logstash.err, logstash.log или logstash.stdout, указывающих на то, что может пойти не так.


person user1553248    schedule 02.02.2016    source источник
comment
Если вы определяете вход как json, вам не нужно запускать фильтр json. Чтобы увидеть, что делает logstash, добавьте раздел вывода stdout {codec = ›rubydebug} и посмотрите, что в итоге окажется в ваших журналах stdout.   -  person Alain Collins    schedule 02.02.2016
comment
такая же проблема ... кажется, что tcp прослушивает netcat ... но logstash не получает или обрабатывает ввод?!?   -  person eigenfield    schedule 15.12.2017


Ответы (3)


Проблема в том, что ваши данные уже десериализованы на вашем входе, и вы пытаетесь снова десериализовать их в своем фильтре. Просто удалите фильтр json.

Вот как я воссоздал ваш сценарий:

# the json input
root@monitoring:~# cat tmp.json 
{"message":{"someField":"someValue"}}


# the logstash configuration file
root@monitoring:~# cat /etc/logstash/conf.d/test.conf
input {
  tcp {
    port => 5400
    codec => json
  }
}

filter{
}

output {
   stdout {
     codec => rubydebug
   }
}


# starting the logstash server
/opt/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf


# sending the json to logstash with netcat
nc localhost 5400 <  tmp.json

# the logstash output via stdout
{
       "message" => {
        "someField" => "someValue"
    },
      "@version" => "1",
    "@timestamp" => "2016-02-02T13:31:18.703Z",
          "host" => "0:0:0:0:0:0:0:1",
          "port" => 56812
}

Надеюсь, это поможет,

person alfredocambera    schedule 02.02.2016

Не забудьте добавить \n в конец JSON:

os.writeBytes("{\"bossMessage\": {\"someField\":\"someValue\"} }" + '\n');
person Dmytro Pashko    schedule 06.06.2018

Я обнаружил, что при использовании кодека на узле ввода TCP анализ JSON не выполняется по неизвестной причине. Удаление кодека на входе TCP и добавление фильтра разрешили только мои проблемы с синтаксическим анализом JSON.

   input {
  tcp {
        port => 5400
  }
}
filter{
  json{
    source => "message"
  }
}
output {
   elasticsearch {
      host => "localhost"
      protocol => "http"
      index => "someIndex"
   }
}

Также я пишу всю строку сразу и не отправляю "\ n" в сообщении, иначе Logstash получит пустую запись только с кодом "\ r".

PrintWriter pw = new PrintWriter(os);
pw.println(stringOut);
pw.flush();

Это добавит "\ r" в конец потока.

person JakesIV    schedule 26.08.2019