如何处理、转换和重新发送来自 syslogd 的 1000req/sec 日志条目?

如何处理、转换和重新发送来自 syslogd 的 1000req/sec 日志条目?

我目前有两台机器,每秒接收大约 1000 个 HTTP 请求,并且每个请求都会生成一个日志条目。此日志集中在另一台机器上运行的 syslog 守护程序上。

由于不太相关的原因,我需要将这些日志发送到内部发布/订阅服务器(每个日志条目将是通过 UDP 发送的 JSON 有效负载),以便进行[近]实时的进一步处理。

我考虑将所有内容保留到 syslog 守护进程,因为我仍然需要集中这些日志,但想知道如何将其从那里转移到发布/订阅服务器。目前我脑海中浮现的几件事并不是特别好:

  • 使用 syslog-ng 和管道作为目的地,并有一个小进程从那里获取内容,对其进行处理并通过 UPD 发送
  • 有一个小进程跟踪集中日志文件,处理新条目并通过 UPD 发送它们。

我很想听听一些更有经验的人可能遇到过类似的问题。理想情况下,syslogd 会从不同的机器接收日志,执行所需的 JSON 转换,通过 UPD 发送,然后将其本地写入集中日志文件。一切都很有争议,可以讨论,因为可能还有其他我从未听说过的解决方案。

这里对性能没有真正的要求(1000 个请求/秒是一个非常小的规模)。这里唯一真正的要求是它应该尽可能接近实时(大约 10 秒的延迟或其他延迟是可以接受的)。

答案1

syslog-ng 是(在我看来)正确的方法。收到消息后,使用 syslog-ng 中的 program() 目标将其发送到 Perl 脚本。如果您想在解析后进行搜索和图表/图形绘制,请尝试使用类似日志记录这将与你尝试执行的操作一致。Perl 无需任何特殊工作,每秒最多可以处理 35k 个事件,因此你在这方面做得很好。检查这里以概览方式了解如何在 LZ(也使用 Perl 程序目标)中完成此操作。

相关内容