logrotate 如何与硬链接文件交互?

logrotate 如何与硬链接文件交互?

我有一个服务,它坚持将日志文件保存在糟糕的位置。在尝试更改日志文件保存位置的所有尝试都失败后,我的下一个想法是在更干净的地方创建指向这些文件的硬链接。这让我产生了一个担忧:

如果我配置 logrotate 来管理这些日志文件,它会按预期工作吗(轮换日志,保持链接正常工作)?还是 logrotate 会意外破坏链接,让日志堆积在它们的原始位置,而不是我的中心位置?

我相信我可以配置 logrotate 在必要时在旋转后重新创建硬链接。但是,有必要吗?

答案1

要回答你的问题,这取决于你进行哪种旋转。例如,将发生以下过​​程:

复制并截断方法:

  1. Logrotate 将日志文件复制到新的日志文件。
    • 新的日志文件仅显示在旧位置。
  2. Logrotate 截断旧文件。
    • 这会将旧文件在两个位置都变为零字节。
  3. 日志文件继续从应用程序填充。

这会将日志文件备份留在旧位置。

解决这个问题的方法很简单:配置 logrotate 来轮换新的位置。旧文件仍将包含正在增长的文件,但仅此一个。

复制并创建方法:

  1. Logrotate 将文件复制到新的日志文件。
    • 该日志文件未硬链接,仅显示在新位置。
  2. Logrotate 删除旧的日志文件。
    • 由于硬链接,这只会删除 logrotate 运行目录中的硬链接。其他目录仍将保留该文件的完整副本。
  3. Logrotate 创建一个新的日志文件。
    • 这不会与其他位置硬链接。

这种方法最成问题,并且您需要一些后旋转魔法来清理它。

答案2

不要链接到文件:链接到目录。如果链接到文件,则当应用程序创建新日志文件时可能会出现问题,无论是作为日志轮换的一部分(取决于如何完成)还是当您停止并稍后重新启动应用程序时。

ln -s /path/to/where/application/creates/logs/ /var/log/application

答案3

我认为您可以使用符号链接到您想要的新位置并告诉 logrotate 在日志实际所在的文件夹中轮换日志; ln -s /path/file /path/to/newlink

相关内容