2016-02-02 2 views
2

Je rencontre des problèmes d'envoi de données de journal à mon instance de logstash à partir d'une simple application Java. Pour mon cas d'utilisation, j'essaie d'éviter d'utiliser log4j logback et de traiter les événements json sur des lignes séparées via un socket tcp brut. La raison en est que je cherche à envoyer des données via une fonction aws lambda à logstash ce qui signifie que le stockage des journaux sur le disque peut ne pas fonctionner.Envoi de données à logstash via tcp

Mon fichier de configuration logstash se présente comme suit:

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

Mon code java est en ce moment juste d'ouvrir une socket TCP sur le serveur logstash et l'envoi d'un événement directement.

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

L'application se connecte à l'hôte logstash correctement (si logstash est pas une exception est levée lors de la connexion), mais aucun événement ne montre dans notre cluster ES. Toutes les idées sur la façon de le faire sont grandement appréciées!

Je ne vois aucun journal pertinent dans logstash.err, logstash.log ou logstash.stdout pointant vers ce qui ne va pas.

+0

Si vous définissez l'entrée comme JSON, vous ne devriez pas besoin de lancer le filtre JSON. Pour voir ce que fait logstash, ajoutez une strophe de sortie "stdout {codec => rubydebug}" et voyez ce qui se termine dans les logs stdout. –

+0

ayant le même problème .. semble que tcp écoute par netcat .. mais logstash ne reçoit pas ou est en train de traiter l'entrée?!? – ifelsemonkey

Répondre

11

Le problème est que vos données sont déjà désérialisées sur votre entrée et que vous essayez de les désérialiser à nouveau sur votre filtre. Retirez simplement le filtre JSON.

Voici comment je recréée votre scénario:

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

Hope it helps,