日志轮转会导致事件丢失或重复

编辑

日志轮转会导致事件丢失或重复编辑

Filebeat 支持从轮转日志文件中读取。但是,一些日志轮转策略会导致使用 Filebeat 转发消息时事件丢失或重复。要解决此问题

  • 避免使用复制和截断日志文件的日志轮转策略

    复制和截断输入日志文件的日志轮转策略会导致 Filebeat 发送重复事件。这是因为 Filebeat 通过 inode 和设备名称识别文件。在日志轮转期间,Filebeat 已经处理过的行被移动到一个新文件。当 Filebeat 遇到新文件时,它会从头开始读取,因为以前的状态信息(偏移量和读取时间戳)与旧文件的 inode 和设备名称相关联。

    此外,如果在复制输入日志文件后但在截断之前将行写入日志文件,则复制和截断输入日志文件的策略会导致事件丢失。

  • 确保 Filebeat 配置为从所有轮转的日志中读取

    当输入日志文件在日志轮转期间被移动或重命名时,Filebeat 能够识别该文件已被读取。在文件轮转后,会创建一个新的日志文件,并且应用程序继续记录。Filebeat 在下次扫描期间会拾取新文件。因为该文件具有新的 inode 和设备名称,所以 Filebeat 会从头开始读取该文件。

    为了避免错过来自轮转文件的事件,请将输入配置为从日志文件和所有轮转的文件中读取。有关示例,请参阅 示例配置

如果您使用的是 Windows,请参阅 有关 Windows 上日志轮转的更多信息

示例配置编辑

本节展示了 logrotate 的典型配置,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 的示例配置。

另请阅读 打开的文件句柄导致 Windows 文件轮转出现问题