将自定义二进制格式提供给 logstash

feed a custom binary format to logstash

我有一些每月要发送到 logstash(或可能是 fluentd)的二进制日志文件。

我遇到的问题是 (TTBOMK) bin 文件无法被 logstash 读取,所以我需要其中之一。

以下哪个选项是将自定义 bin 文件读入 logstash 的最佳方式?

我已经设置了一个基于 nodejs 的 js 脚本,它可以读取二进制文件并创建文档的可读文本版本。它可以是 运行 作为 CLI 或 http 服务,并且 return 仅在设置的行号之后的行。是否可以直接或间接将其与 logstash 集成(这样就不需要我重写代码)。

如果不是,是否值得将脚本重写为 logstash 插件?

如果选项 1 行不通,而选项 2 会花费太多时间来实施,我正在考虑生成文本版本。由于生成的文档有几 GB 的大小,我想删除这些文件,或者如果可能的话,删除文件中已经阅读过的部分。有什么方法可以从 logstash 获得关于已读内容的反馈吗?

PS 我正在 运行 宁在 Windows 服务器上,如果有什么不同的话

最简单的方法是将二进制格式转换为 json 并将其提供给 logstash。通过文件或其他机制。主要是因为当你在 logstash 中抛出 json 时,过滤器的配置非常简单:

filter {
    if [type] == "my_json_type" {
        json {
            source => "message"
        }
    }
}

这将为您将 json 文档分解为字段,包括嵌套在 json 中的文档。如果我们讨论的是大量内容,我建议通过套接字而不是文件来提供它,因为当文件为 "done with" 时,开箱即用不支持任何类型的通知。因此您的输入定义可能如下所示:

tcp {
    port => 4567
    type => "my_json_type"
}

这将在端口 4567 上打开一个侦听套接字,并将接收到的每一行都视为行,并且过滤器将进一步将其适当地处理为 json 文档。然后在您的 node.js 中,您可以处理已经提供给 logstash 的日志。

你漏掉了很多细节,所以希望我把它们都弄清楚了。

如果您有 http 服务,logstash 有一个 http_poller 输入可以 poll it

我不建议为 logstash 编写插件。该生态系统中的事情继续迅速变化。

从 logstash 的角度来看,创建纯文本文件是最简单的想法。 Logstash 不会明确告诉你它已经处理了一个文件,但你可以在注册表中查找它(在 unix 中,一个名为“.sincedb*”的文件,通常在 /var/lib/logstash 中,其中包含索引节点号和文件大小偏移量)以查看文件是否已 100% 处理。

有很多其他方法可以将输入馈送到 logstash,包括 tcp/ucp 输入或代理(rabbit、redis 等),它们可能适合您的工作流程。

当然,所有这些可能都有 Windows 相关的注意事项。