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

编辑

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

编辑

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 的示例配置。

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