加载中

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

Filebeat 支持从轮转的日志文件中读取数据,包括 GZIP 压缩文件。但是,在使用 Filebeat 转发消息时,某些日志轮转策略可能会导致事件丢失或重复。为避免此问题

  • 更改 filestream 输入的默认文件标识时请务必小心

    默认情况下,filestream 输入的文件标识设置为 fingerprint,它使用由 filestream 输入的扫描器组件生成的文件指纹来识别文件。更改文件标识配置可能会导致输出中出现重复事件。

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

    为避免遗漏轮转文件中的事件,请配置输入以从日志文件及所有轮转文件中读取。

    当输入日志文件在日志轮转期间被移动或重命名时,Filebeat 能够识别出该文件已被读取。文件轮转后,会创建一个新的日志文件,并且应用程序继续记录日志。如果轮转日志包含在配置路径中,Filebeat 将在下一次扫描时捕获新文件。

    有关示例,请参考 配置示例

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

    如果在复制输入日志文件之后、截断之前向日志文件写入了行,则复制并截断输入日志文件的策略可能会导致事件丢失。

    注意

    在 9.0.0 之前的 Filebeat 版本中,使用此类策略还可能导致事件重复。在这些版本中,由于 filestream 输入的 文件标识配置 默认设置为 native,因此 Filebeat 通过 inode 和设备 ID 来识别文件。在日志轮转期间,Filebeat 已经处理过的行会被移动到新文件中。如果文件标识设置为 native,当 Filebeat 遇到新文件时,它会从头开始读取,因为先前的信息状态(偏移量和读取时间戳)与旧文件的 inode 和设备 ID 关联。

如果您使用的是 Windows,请同时查看 关于 Windows 日志轮转的更多信息

本节展示了 logrotate(Linux 上用于执行日志轮转的流行工具)的典型配置,随后是读取所有轮转日志的 Filebeat 配置。

在此示例中,Filebeat 读取 Web 服务器日志。日志每天轮转一次,并且使用指定的权限创建新文件。

/var/log/my-server/my-server.log {
    daily
    missingok
    rotate 7
    notifempty
    create 0640 www-data www-data
}
		

在此示例中,Filebeat 配置为读取所有日志文件,以确保不会丢失任何事件。

filebeat.inputs:
- type: filestream
  id: my-server-filestream-id
  paths:
  - /var/log/my-server/my-server.log*
		

在 Windows 上,如果旧文件正在被 Filebeat 处理,那么删除旧文件并将较新文件重命名为旧文件名的日志轮转方案可能会被阻塞。发生这种情况是因为,直到最后一个进程关闭该文件之前,Windows 不会删除文件和文件元数据。与大多数 *nix 文件系统不同,在访问该文件的所有进程关闭被删除的文件之前,Windows 文件名无法被重用。

为避免此问题,请在轮转的文件名中使用日期。文件永远不会被重命名为较旧的文件名,并且日志写入器和日志轮转器将始终能够打开该文件。这种方法还极大地降低了日志写入、轮转和收集相互干扰的可能性。

由于日志轮转通常由日志记录应用程序处理,因此我们不提供 Windows 的配置示例。

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

© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.