2016-02-02 3 views
2

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

Мой конфигурационный файл 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, указывая на то, что может быть неправильным.

+0

Если определить входные данные как JSON, вам не нужно запускать JSon фильтр. Чтобы узнать, что делает logstash, добавьте строфу «stdout {codec => rubydebug}» и посмотрите, что попадает в ваши журналы stdout. –

+0

с такой же проблемой .. кажется, что tcp прослушивает netcat .. но logstash не получает или обрабатывает вход?!? – ifelsemonkey

ответ

11

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

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

# the json input 
[email protected]:~# cat tmp.json 
{"message":{"someField":"someValue"}} 


# the logstash configuration file 
[email protected]:~# 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 
} 

Надеется, что это помогает,

Смежные вопросы