使用 syslog-ng 进行远程日志记录会挂起我的应用程序吗?

使用 syslog-ng 进行远程日志记录会挂起我的应用程序吗?

我希望每台服务器都将日志发送到 /var/log 并复制到远程 syslog-ng 服务器。我听说过一些轶事,如果网络出现问题,远程日志记录可能会挂起您的应用程序。我是否应该担心我的应用程序在远程日志记录时挂起,我该如何修复/解决这个问题?

答案1

不会。首先,在本地操作系统中,切换是异步的。系统日志库和本地系统日志守护程序要么接受消息但无法传递,要么快速失败,但无论哪种方式,您的应用程序都不会挂起。其次,网络协议(默认情况下)是 udp,因此即使您的应用程序在数据包发出之前被阻止,它也会立即发出并将控制权返回给您的应用程序,无论它是否真正到达收集主机。

当人们想到在 *nix 领域远程日志挂起时,通常是因为他们正在将日志记录到 nfs 挂载,这肯定会导致挂起。Syslog,你做得很棒。

答案2

这确实会发生 - 在很多情况下都可能发生这种锁定,它们基本上都归结为系统日志队列或缓冲区已满,因此写入被延迟。

这(通常)往往会使问题更加复杂,因为事情开始失败,并且想要发出尽可能多的信号,但需要等待系统日志接受他们的消息。

请注意,在这种情况下也存在可能导致不当行为的错误 - 值得注意的是,rsyslog 在 RH 上导致了此问题(https://bugzilla.redhat.com/show_bug.cgi?id=519203)因此我强烈建议您检查软件版本是否存在已知错误。

另外,请检查 syslog 的 DNS 设置 - 对于推送 syslog 的客户端,我认为没有理由使用 DNS。对于接收服务器,如果您可以不用 DNS 查找,这可能值得尝试看看它是否有助于提高吞吐量。

幸运的是,还有许多修复程序(不是专门针对 syslog-ng),但您需要做出某种妥协,这是简短的版本。

  1. 如果您可以容忍丢失一些数据,则将日志记录切换到 UDP 是一种选择。显然,考虑到您所描述的问题类型,几乎可以肯定的是,如果您这样做,您将要丢失一些数据。

  2. 另一个选项是更有选择性地发送网络流量 - 即过滤和/或优先处理某些流量。这有多大帮助部分取决于您选择的 syslog 实现中有哪些选项可用 - rsyslog 有很多选项,其他选项我不太熟悉。

  3. 并不总是需要直接登录网络。您可以考虑不这样做,而是使用某种日志跟踪/解析代理(例如https://www.elastic.co/products/logstash) - 这可以避免接触正在工作的 syslog 设置,同时仍然具有远程日志记录(如果您当前没有将数据存储到文件,您还可以让代理在本地主机上监听,并在本地转发 syslog 数据)。

  4. 同样,我建议您检查您的 auditd 策略,看看是否有任何可能导致问题的东西。值得注意的是,如果 auditd 正在记录到 syslog,流量可能会相当大,即使(或特别是)使用“最佳实践”配置(例如 CIS 基准)。我已经看到这在几个方面造成了问题,在某些情况下,当 audispd 无法再将消息推送到 syslog 时,它可能会阻塞。

  5. 最后,对于 rsyslog 之类的东西,您还可以选择使用磁盘和内存队列来缓解这些问题。这需要一些设置(对于 rsyslog,请参阅http://www.rsyslog.com/doc/v8-stable/concepts/queues.html),但确实允许构建一个容错性更强的设置,如果您不介意投入一些资源来解决问题。

Rsyslog 提供了高性能设置指南(http://www.rsyslog.com/doc/v8-stable/examples/high_performance.html) 和故障转移系统日志服务器 (http://www.rsyslog.com/doc/v8-stable/tutorials/failover_syslog_server.html)。我绝对会建议您至少调查一下中央日志服务器,以确保它能够处理大量的日志记录 - 并以其他方式对其进行调整(我使用 rsyslog 执行此操作的经验很好,其中相当“标准”的接收器配置无法跟上,但对其进行调整使我们能够支持几个数量级的更多流量)。

此外,请考虑更全面地检查您的日志配置 - 我从(悲伤的)经验中知道,人们可能倾向于启用 TRACE 或 DEBUG 日志并保持开启状态,这通常不会给 syslog(或更普遍的系统)带来太多好处。

答案3

与上述 bagster/growse 和 gparent 的经历类似,我也遇到过这样的情况:当使用 syslog-ng 且远程服务器不可用时,对 vsyslog() 的调用会挂起(30 秒到 20 分钟)。

我要指出的是,为了重现这个问题,我必须在远程服务器无法访问时重新加载 syslog-ng(service syslog-ng reload)(我实际上是在禁用交换机上的网络端口),同时我还在生成大量要发送到远程服务器的流量。

还请注意,我正在通过 UDP 进行记录,您希望它能够实现即发即弃的非阻塞功能。

我很乐观地认为我可以很好地描述这一点,以便针对 syslog-ng 提交错误报告,并且如果/当我这样做时,我会在这里更新。

答案4

我知道这是一条旧消息,但如果其他人访问此页面,我会回答。

我们见过远程日志记录导致服务器挂起的情况。当 Syslog-ng 失去对其日志主机的网络访问时,它会开始缓冲。当缓冲区已满时,它会停止从/dev/log已“满”的文件读取数据,导致我们的审计失败,并尝试写入/dev/log

相关内容