日志轮换导致事件丢失或重复
编辑日志轮换导致事件丢失或重复
编辑Filebeat 支持从轮换的日志文件中读取。然而,当使用 Filebeat 转发消息时,某些日志轮换策略可能会导致事件丢失或重复。要解决此问题,请:
-
避免复制和截断日志文件的日志轮换策略
复制和截断输入日志文件的日志轮换策略可能会导致 Filebeat 发送重复事件。这是因为 Filebeat 通过 inode 和设备名称识别文件。在日志轮换期间,Filebeat 已经处理过的行会被移动到一个新文件中。当 Filebeat 遇到新文件时,它会从头开始读取,因为之前的状态信息(偏移量和读取时间戳)与旧文件的 inode 和设备名称相关联。
此外,如果行在复制后但在截断之前写入日志文件,则复制和截断输入日志文件的策略可能会导致事件丢失。
-
确保 Filebeat 配置为从所有轮换的日志中读取
当输入日志文件在日志轮换期间被移动或重命名时,Filebeat 能够识别该文件已被读取。文件轮换后,会创建一个新的日志文件,并且应用程序继续记录。Filebeat 会在下次扫描时拾取新文件。因为该文件具有新的 inode 和设备名称,所以 Filebeat 会从头开始读取它。
为了避免丢失轮换文件中的事件,请配置输入以从日志文件和所有轮换文件中读取。有关示例,请参阅 示例配置。
如果您使用的是 Windows,另请参阅 关于 Windows 上日志轮换的更多信息。
示例配置
编辑本节展示了 logrotate(一种用于在 Linux 上执行日志轮换的流行工具)的典型配置,以及读取所有轮换日志的 Filebeat 配置。
logrotate.conf
编辑在此示例中,Filebeat 读取 Web 服务器日志。日志每天轮换,并使用指定的权限创建新文件。
/var/log/my-server/my-server.log { daily missingok rotate 7 notifempty create 0640 www-data www-data }
filebeat.yml
编辑在此示例中,Filebeat 配置为读取所有日志文件,以确保不会错过任何事件。
filebeat.inputs: - type: filestream id: my-server-filestream-id paths: - /var/log/my-server/my-server.log*
关于 Windows 上日志轮换的更多信息
编辑在 Windows 上,如果旧文件正被 Filebeat 处理,则删除旧文件并将较新文件重命名为旧文件名的日志轮换方案可能会被阻止。这是因为 Windows 在最后一个进程关闭文件之前不会删除文件和文件元数据。与大多数 *nix 文件系统不同,在访问该文件的所有进程都关闭已删除的文件之前,Windows 文件名无法被重用。
为了避免此问题,请在轮换文件名中使用日期。该文件将永远不会被重命名为较旧的文件名,并且日志写入器和日志轮换器始终能够打开该文件。这种方法还大大降低了日志写入、轮换和收集相互干扰的可能性。
因为日志轮换通常由日志记录应用程序处理,所以我们没有提供 Windows 的示例配置。