Logstash 索引 JSON 数组,但不单独索引 JSON 对象

问题描述 投票:0回答:1

我使用 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()
在下一次迭代开始之前未完成操作,但它不会发送错误。

javascript node.js json tcp logstash
1个回答
0
投票

好吧,我找到了解决办法。 将输入编解码器更改为

json_lines
,并在写入 JSON 对象后在字符串中手动插入新行。这就是变化的样子

 const success = client.write(JSON.stringify(event) + "\n")

这看起来像是一个老套的解决方案,但嘿它确实有效。对于这种情况,我能想到的只是

client.write()
在每次循环迭代后不将消息视为单个单元。

© www.soinside.com 2019 - 2024. All rights reserved.