Erlang disk_log:如何输出原始 text/JSON 以与 logstash 交互?

Erlang disk_log : how to output raw text/JSON for interfacing with logstash?

我有:

  1. 具有大量 Erlang VM 的集群转储日志 disk_log
  2. logstash 将汇总 disk_log
  3. 写入的日志
  4. elasticsearch 与 logstash 一起用于(半)实时搜索日志。

我的问题是 disk_log 的输出是 Erlang 的内部格式。我如何连接到 logstash ?我可以在另一个 Erlang VM/process 中解析 disk_log 输出文件,而它仍在写入(它是一个日志,毕竟,只要 Erlang VM 运行,它就会打开)并将其转储到 logstash 的原始 text/JSON 中?有什么问题吗?

您有两个选择:

  1. 您应该能够使用另一个 Erlang VM 读取该文件,同时它仍然使用 disk_log:chunk/2disk_log:chunk/3 打开。然后,您可以将术语翻译成 JSON(例如使用 Jiffy or JSX)并将它们发送到 logstash(例如通过 UDP)。

这个解决方案会很慢,因为它需要先写入磁盘,然后再从磁盘读取。 disk_log 通常用于高性能,因此增加这么多开销感觉不对。

  1. 您可以在您的应用程序中添加直接通过 UDP 将日志发送到 graylog。这很好,因为它在磁盘上的开销要小得多,但你需要记住在每个地方添加两种类型的日志(disk_log 和 JSON 通过 UDP)。

  2. 忘记 disk_log 并使用 lager. Lager became standard, when you need to log anything in Erlang. The feature list is impressing. You can define different backends. In your case: file and graylog. File backend is included with lager and you can find graylog backend here。即使拥有如此强大的功能,它仍然具有高性能。