単純なJavaアプリケーションからlogstashインスタンスにログデータを送信する際に問題が発生しています。私のユースケースでは、log4jログバックの使用を避け、代わりにjsonイベントを個別にバッチ処理しようとしています。生のtcpソケットを介した行。その理由は、aws lambda関数を介してlogstashにデータを送信しようとしているためです。つまり、ログをディスクに保存してもうまくいかない可能性があります。
私のlogstash構成ファイルは次のようになります。
input {
tcp {
port => 5400
codec => json
}
}
filter{
json{
source => "message"
}
}
output {
elasticsearch {
Host => "localhost"
protocol => "http"
index => "someIndex"
}
}
私のJavaコードは現在、logstashサーバーへのtcpソケットを開いて、イベントを直接送信しています。
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に、何が問題になっている可能性があるかを示す関連ログがありません。
問題は、データが入力ですでに逆シリアル化されており、フィルターで再度逆シリアル化しようとしていることです。 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
}
それが役に立てば幸い、
JSONの最後に\n
を追加することを忘れないでください。
os.writeBytes("{\"bossMessage\": {\"someField\":\"someValue\"} }" + '\n');
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」が追加されます。