我使用 Node.js 通过 TCP 发送日志。当作为 JSON 数组发送时,日志将被摄取(仅注释行,不带循环)。但是,如果我迭代数组并单独发送它们,则只会摄取第一个日志。其余的甚至不会显示在 Logstash 日志中。我需要单独发送它们,以便 Logstash 可以将它们解析为 Elasticsearch 中各自的索引,而当作为数组发送时,它无法识别这些索引。
const client = new net.Socket();
client.connect(LOGSTASH_PORT, LOGSTASH_HOST, () => {
for (const event of allEvents) {
const success = client.write(JSON.stringify(event), (error) => {
if (error) {
console.error('Error writing to socket:', error);
} else {
console.log('Data written successfully');
}
});
}
//const success = client.write(JSON.stringify(allEvents));
client.end();
});
drain
事件没有帮助。这就是我的 Logstash 配置的样子
input {
tcp {
port => "5400"
codec =>"json"
}
}
filter {
}
output {
stdout { codec => json }
elasticsearch {
index => "<some index name>"
hosts=> "${ELASTIC_HOSTS}"
user=> "${ELASTIC_USER}"
password=> "${ELASTIC_PASSWORD}"
cacert=> "<some path>"
}
}
我已经尝试过
json_lines
编解码器,但这没有帮助。问题可能是 client.write()
在下一次迭代开始之前未完成操作,但它不会发送错误。
好吧,我找到了解决办法。 将输入编解码器更改为
json_lines
,并在写入 JSON 对象后在字符串中手动插入新行。这就是变化的样子
const success = client.write(JSON.stringify(event) + "\n")
这看起来像是一个老套的解决方案,但嘿它确实有效。对于这种情况,我能想到的只是
client.write()
在每次循环迭代后不将消息视为单个单元。